2011-06-24 56 views
12

我們有一個佔位符的蛋,它不包含任何代碼,只是爲了從我們的PyPi存儲庫中拉取一個依賴包列表而存在。是否可以在setup.py中表示特定於平臺的依賴關係,而無需構建特定於平臺的我的蛋的版本?

大多數這些從屬軟件包是平臺不可知的,但有些僅用於Win32平臺。

是否有可能以某種方式使依賴平臺條件,以便我的install_requires列表中給定的依賴項只會在Win32上安裝時被拉下?

或者:是否可以指定可選的依賴關係的列表,這將如果有安裝,但不會導致easy_install,如果他們不失敗?

回答

4

使用extras_require分發選項,以使 '支持Win32' 可選功能:

setup(
    ... 
    extras_require={ 
    'win32': 'pywin32' 
    }, 
    ... 
) 

,則在Windows上安裝時指定的win32功能:

easy_install mypackage[win32] 

這將拉低pywin32包,它被列爲mypackage中的「Win32的」功能的依賴。

有關可選功能的更多信息,請參見here

11

setup.py

from setuptools import setup 
import sys 

setup(
    name="...", 
    install_requires=["This", "That"] + (
     ["WinOnly", "AnotherWinOnly"] if sys.platform.startswith("win") else [] 
     ) 
) 

distutils.util.get_platformsys.platform詳細信息,如果您需要它:

>>> sys.platform 
'linux2' 
>>> distutils.util.get_platform() 
'linux-i686' 
+3

大概是通過這樣的邏輯產生依賴性的名單將在我的雞蛋元數據出爐,這意味着如果我*建* Windows上的雞蛋那麼它將有Windows的依賴,然後將失敗在那些依賴關係不可用的Linux上安裝? –

+0

我不知道它是如何工作的。我認爲,因爲''設置。py''在安裝時執行,依賴關係將在安裝時生成。但是這應該很容易測試。 – codeape

+3

請注意,平臺檢查應該是「if sys.platform =='win32''',否則它會通過Mac OS X(* darwin *),請參閱http://stackoverflow.com/questions/2144748/is-它是安全的使用sys平臺win32檢查64位python – kraymer

0

製作蛋時(使用python setup.py bdist_egg),您可以強制setuptools/distribute構建平臺特定的蛋。

from setuptools import setup 
import os 

# Monkey-patch Distribution so it always claims to be platform-specific. 
from distutils.core import Distribution 
Distribution.has_ext_modules = lambda *args, **kwargs: True 

requirements = ['generic-foo', 'generic-bar'] 

if os.getenv('WINDOWS_BUILD'): 
    requirements.extend(['a-windows-only-requirement']) 

setup(
    name="...", 
    install_requires=requirements 
) 

然後,您可以簡單地做:

# Force a windows build 
$ WINDOWS_BUILD=y python setup.py bdist_egg -p win32 
# Do a linux build -- you may not need to specify -p if you're happy 
# with your current linux architecture. 
$ python setup.py bdist_egg -p linux-i686 
+0

這是哈克;此外,這個問題指定*沒有*建立平臺特定的雞蛋! –

6

看到https://stackoverflow.com/a/32955538/875667的車輪

,這從sdist或卵子的釋放:http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies

有時候,一個項目可能需要依賴性在特定平臺上運行。這可能會返回一個模塊的端口,以便它可以在較早的python版本中使用。或者它可能是一個需要在特定操作系統上運行的軟件包。這將允許項目在多個不同的平臺上工作,而不需要安裝安裝該項目的平臺所不需要的依賴關係。

setup(
    name="Project", 
    ... 
    install_requires=[ 
     'enum34;python_version<"3.4"', 
     'pywin32 >= 1.0;platform_system=="Windows"' 
    ] 
) 
相關問題