在setup.py中表达平台特定依赖而不构建特定版本的egg是否可行?

45 投票
4 回答
15234 浏览
提问于 2025-04-16 20:13

我们有一个占位符的包,这个包里面没有任何代码,存在的目的只是为了从我们的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”功能所需要的。

想了解更多关于可选功能的信息,可以查看 这里

撰写回答