2013-04-17 79 views
7

有什麼辦法可以告訴setuptools或分發需要在特定平臺上的軟件包嗎?我使用readline作爲Unix系統上的標準庫的一部分,但在Windows上,我需要pyreadline模塊來替換該功能(參見this question)。如果我只是把它放在要求它也安裝在Unix系統,它是完全無用的。Setuptools平臺特定的依賴項

回答

6

setup.py只是一個python腳本。您可以在腳本中創建動態相關性:

import platform 

setup_requires = ['foo', 'bar'] 

if platform.system() == 'Windows': 
    setup_requires.append('pyreadline') 

setup(
    # ... 
    setup_requires=setup_requires, 
) 
+1

如果我上傳二進制發行版,這仍然可以嗎? –

+0

二進制分發*是特定平臺*。您通常希望避免創建二進制分發;只有在您的軟件包包含C擴展名時纔會這樣做,然後僅適用於Windows。而且你已經在Windows上構建*這些*,所以依賴關係將被正確設置。 –

+0

這適用於'python setup.py install',但是如果我上傳了一個源代碼發佈版,如何在使用'pip install mypkg'下載它時嘗試安裝源代碼發佈版的Windows客戶端工作? –

12

雖然由馬亭皮特斯給出的answer當時完全有效,Python打包自那時以來發生了很大變化。

分發包的首選格式是使用wheels *。使用輪子在安裝過程中不可能運行Python代碼。

車輪在PEP 0427中指定使用元數據版本2。 Environment markers可用於指定平臺特定的依賴關係。

Setuptools允許將這些環境標記指定爲extras_require鍵。以下腳本示例取決於Windows系統的pyreadline和Linux發行版的pyxdg

#!/usr/bin/env python 
from setuptools import setup 

setup(
    name='spam', 
    version='0.0.1', 
    extras_require={ 
     ':sys_platform == "win32"': [ 
      'pyreadline' 
     ], 
     ':"linux" in sys_platform': [ 
      'pyxdg' 
     ] 
    }) 

*同時發佈sdist,所以無法使用wheel的平臺仍然可以安裝您的軟件包。

+2

這應該完全是被接受的答案! –

+2

而不是':sys_platform ==「win32」'',它更具可讀性和直觀性,可以寫入''platform_system =='Windows'''。而不是在sys_platform中使用'':'linux',你可以使用''platform_system =='Linux'''。這將包括'linux'和'linux2'。其他平臺也一樣,mac是''platform_system =='Darwin「''等等等等。參考:[''PEP 508'](https://www.python.org/dev/peps/pep-0508/ #環境標記)和[EasyBuilders](https://github.com/easybuilders/easybuild/wiki/OS_flavor_name_version) – smac89

+0

由於'install_requires'和'extras_require'都具有平臺特定依賴性的機制,所以只是想知道哪一個被建議?例如,在'Pipenv'中,支持Pipfile〜中的extras_require仍然存在問題 – Drake

1

儘管Remco Haszing和Martijn Pieters給出的答案是有效的,並且如果您要支持舊的setuptools版本,可能會更方便,但從那時起,Python包裝發生了很大變化。我將指出一些指定需求的新方法。

最近setuptools的版本接受PEP 508風格依賴性規範:

setup(
    # ... 
    install_requires=[ 
     'pyreadline; platform_system == "Windows"', 
    ], 
) 

選擇合適的參數:

  • install_requires:什麼其他的發行所需要的電流分佈正常工作
  • extras_require:將可選特徵名稱映射到其要求列表的字典
  • setup_requires:其他發行版需要目前以使安裝腳本正常運行 注意:setup_requires中列出的項目將不會自動安裝。如果它們不在本地可用,它們將簡單地下載到./.eggs目錄。

還有一種通過setup.cfg文件提供這些參數的替代方法。 See the documentation for more info

注意:隨着時間的推移,對PEP 508和setup.cfg的支持已逐漸添加到setuptools。因此,如果您使用的是他們,dependending您所使用的功能,你可能需要將下面的行添加到您的setup.py的beggining:

from distutils.version import StrictVersion 
from setuptools import __version__ as setuptools_version 


if StrictVersion(setuptools_version) < StrictVersion('38.3.0'): 
    raise SystemExit(
     'Your `setuptools` version is old. ' 
     'Please upgrade setuptools by running `pip install -U setuptools` ' 
     'and try again.' 
    ) 

我們現在也有PEP 518,即引入了一個新的,更強大方式爲pyproject.toml文件中指定setup_requires

[build-system] 
# Minimum requirements for the build system to execute. 
requires = ['setuptools>"38.3.0"', 'wheel'] # PEP 508 specifications. 

正如你所看到的,我們將能夠自動安裝和更新setuptools或許其他一些包裝工具。這will be probably shipped with pip 9.1

相關問題