有什麼辦法可以告訴setuptools或分發需要在特定平臺上的軟件包嗎?我使用readline
作爲Unix系統上的標準庫的一部分,但在Windows上,我需要pyreadline
模塊來替換該功能(參見this question)。如果我只是把它放在要求它也安裝在Unix系統,它是完全無用的。Setuptools平臺特定的依賴項
回答
setup.py
只是一個python腳本。您可以在腳本中創建動態相關性:
import platform
setup_requires = ['foo', 'bar']
if platform.system() == 'Windows':
setup_requires.append('pyreadline')
setup(
# ...
setup_requires=setup_requires,
)
雖然由馬亭皮特斯給出的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的平臺仍然可以安裝您的軟件包。
這應該完全是被接受的答案! –
而不是':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
由於'install_requires'和'extras_require'都具有平臺特定依賴性的機制,所以只是想知道哪一個被建議?例如,在'Pipenv'中,支持Pipfile〜中的extras_require仍然存在問題 – Drake
儘管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。
- 1. 特定於平臺的依賴關係爬到Eclipse插件中
- 2. Gemfile.lock和gem的特定平臺依賴關係?
- 3. rubygems特定於平臺的依賴關係
- 4. Xamarin.Forms Prism:Android依賴注入特定於平臺的服務
- 5. 包含特定於平臺的Java依賴項(未將我的頭髮着火)
- 6. setuptools搜索錯誤依賴
- 7. 如何查找依賴於特定版本的特定依賴項的內容?
- 8. Nuget是否支持與特定平臺綁定的依賴關係?
- 9. 是CKeditor contextmenu平臺的依賴?
- 10. Java依賴於平臺的類繼承
- 11. setuptools的依賴和進口問題
- 12. 如何忽略Gradle中所有依賴項的特定傳遞依賴項
- 13. JNI依賴和跨平臺構建
- 14. OpenFlow實施平臺是否依賴?
- 15. JAVA支持平臺「依賴」概念?
- 16. C++非平臺依賴聲音
- 17. 處理C++依賴關係(跨平臺)
- 18. GUI依賴於語言和平臺?
- 19. C++中平臺依賴狀態mt19937?
- 20. .NET跨平臺緩存依賴關係
- 21. setuptools如何處理傳遞依賴?
- 22. imdbpy和setuptools - 依賴關係問題
- 23. 在Mac上安裝python依賴項之前安裝setuptools
- 24. 在biicode中處理未解決的依賴於平臺的依賴關係
- 25. 將maven項目的依賴項複製到特定文件夾
- 26. 創建Eclipse插件時避免依賴於平臺的依賴關係
- 27. 如何從依賴列表中的特定依賴的目標
- 28. 力依賴於使用特定的子版本的依賴
- 29. 向pom.xml添加自定義jar(依賴項)依賴項
- 30. 雙綁定罐依賴項
如果我上傳二進制發行版,這仍然可以嗎? –
二進制分發*是特定平臺*。您通常希望避免創建二進制分發;只有在您的軟件包包含C擴展名時纔會這樣做,然後僅適用於Windows。而且你已經在Windows上構建*這些*,所以依賴關係將被正確設置。 –
這適用於'python setup.py install',但是如果我上傳了一個源代碼發佈版,如何在使用'pip install mypkg'下載它時嘗試安裝源代碼發佈版的Windows客戶端工作? –