在setup.py中表达平台特定依赖而不构建特定版本的egg是否可行?
我们有一个占位符的包,这个包里面没有任何代码,存在的目的只是为了从我们的PyPi仓库中拉取一系列依赖包。
这些依赖包大部分是可以在任何平台上使用的,但有一些只在Win32平台上使用。
有没有办法让这些依赖包根据平台来选择,也就是说在我的 install_requires
列表中的某个依赖包,只有在Win32系统上安装时才会被下载?
另外:有没有办法指定一份可选的依赖包列表,如果这些包可用就安装,但如果不可用也不会导致 easy_install
失败?
4 个回答
12
在 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_platform
提供的信息比 sys.platform
更详细:
>>> sys.platform
'linux2'
>>> distutils.util.get_platform()
'linux-i686'
56
关于sdist、egg和wheel的发布,可以参考这个链接:https://setuptools.readthedocs.io/en/latest/userguide/dependency_management.html#platform-specific-dependencies
有时候,一个项目可能需要在特定的平台上运行某些依赖。这可能是为了让一个模块在旧版本的Python中也能使用的包,或者是某个特定操作系统上必须的包。这样一来,项目就可以在不同的平台上运行,而不需要安装那些在当前平台上并不需要的依赖。
setup(
name="Project",
...
install_requires=[
'enum34 ; python_version<"3.4"',
'pywin32 >= 1.0 ; platform_system=="Windows"'
]
)
11
使用 extras_require
这个选项,可以把“win32支持”设置成一个可选的功能:
setup(
...
extras_require={
'win32': 'pywin32'
},
...
)
然后在Windows上安装时,指定需要win32这个功能:
easy_install mypackage[win32]
这样就会下载 pywin32
这个包,因为它是我的软件包“mypackage”的“win32”功能所需要的。
想了解更多关于可选功能的信息,可以查看 这里。