我有一個模塊,可以在Python 2和Python 3上工作。在Python < 3.2我想安裝一個特定的包作爲依賴。對於Python> = 3.2。install_requires基於python版本
喜歡的東西:
install_requires=[
"threadpool >= 1.2.7 if python_version < 3.2.0",
],
怎麼能作出這樣的?
我有一個模塊,可以在Python 2和Python 3上工作。在Python < 3.2我想安裝一個特定的包作爲依賴。對於Python> = 3.2。install_requires基於python版本
喜歡的東西:
install_requires=[
"threadpool >= 1.2.7 if python_version < 3.2.0",
],
怎麼能作出這樣的?
setuptools
支持這個使用environment markers。
install_requires=[
'enum34;python_version<"3.4"',
'pywin32 >= 1.0;platform_system=="Windows"'
]
使用這個在official documentation中詳述。根據v20.5增加了change log,但是直到v20.8.1(這只是15天的差距)之前,實施並不穩定。
原來的答案(依然有效,但在將來可能不支持):
setuptools
有這個使用
extras_require
參數中的支持。
的格式如下:
extras_require={
':python_version=="2.7"': ["mock"],
},
它將支持其他比較運算符。
不幸的是,它沒有在documentation中提到。在尋找答案時,我發現PEP-426在談論「環境標記」。用這句話我能找到一個setuptools ticket以下評論:
我已經成功地使用標記功能來選擇性地和聲明性地要求依賴。例如,請參閱backports.unittest_mock。通過'extras',模擬將是必需的,但僅限於Python 2.當我可以依賴Setuptools 17.1時,我可以將該依賴改爲
python_version < "3.3"
。
這已經討論了here,它會出現推薦的方式是使用sys.version_info
在setup.py
裏面測試Python版本;
import sys
if sys.version_info >= (3,2):
install_requires = ["threadpool >= 1.2.7"]
else:
install_requires = ["threadpool >= 1.2.3"]
setup(..., install_requires=install_requires)
這個解決方案很脆弱,有很多'pip'和'wheel'包的組合。當pip以您的名義建立輪子時,計算出的install_requires列表將寫入輪子元數據中,然後緩存的輪子可用於不同的Python版本。 –
可能重複[install \ _requires in setup.py,取決於已安裝的Python版本](https://stackoverflow.com/questions/6080646/install-requires-in-setup-py-depending-on-已安裝-python-version) – ederag