是否有可能在setup.py中表达特定于平台的依赖关系而无需构建特定于平台的版本的egg?

时间:2011-06-24 14:49:02

标签: python setuptools distutils

我们有一个占位符egg,它不包含任何代码,只是为了从PyPi存储库中提取依赖包列表而存在。

这些依赖包中的大多数都是与平台无关的,但有些只在Win32平台上使用。

是否有可能以某种方式使依赖平台 - 条件化,以便我的install_requires列表中的给定依赖项只会在Win32上安装时被拉下来?

另外:是否可以指定可选依赖项列表,如果可用,将会安装这些依赖项,但如果不是,则不会导致easy_install失败?

4 个答案:

答案 0 :(得分:19)

请参阅https://stackoverflow.com/a/32955538/875667了解轮子

这对于sdist或egg释放来自: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"'
    ]
)

答案 1 :(得分: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'

答案 2 :(得分:4)

使用extras_require分发选项使'win32 support'成为可选功能:

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

然后在Windows上安装时指定win32功能:

easy_install mypackage[win32]

这将下拉pywin32包,该包被列为mypackage的'win32'功能的依赖项。

有关可选功能的详情,请参阅here

答案 3 :(得分:1)

当构建蛋时(使用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