2014-01-13 104 views
21

我有一個模塊,可以在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", 
], 

怎麼能作出這樣的?

+0

可能重複[install \ _requires in setup.py,取決於已安裝的Python版本](https://stackoverflow.com/questions/6080646/install-requires-in-setup-py-depending-on-已安裝-python-version) – ederag

回答

35

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"

+1

這是正確的答案,順便提一下,較舊的Python版本(例如2.7.6)會拋出錯誤,因爲它們的'setuptools'版本無法識別該語法。因此,如果您需要更多兼容性,請使用更便攜的版本,例如@iTayb提出的版本。 –

+1

有沒有人知道在「python_version」之前使用「:」?它是否記錄在某處? – AXO

+0

支持此標記的setuptools的最早版本是什麼? – AXO

9

這已經討論了here,它會出現推薦的方式是使用sys.version_infosetup.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) 
+4

這個解決方案很脆弱,有很多'pip'和'wheel'包的組合。當pip以您的名義建立輪子時,計算出的install_requires列表將寫入輪子元數據中,然後緩存的輪子可用於不同的Python版本。 –