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

Dan*_*nov 22 python distutils setuptools

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

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

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

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

wta*_*yeb 26

有关车轮,请参阅/sf/answers/2306887691/

这对于s​​dist或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"'
    ]
)
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,特殊变量“python_version”和“platform_system”不需要在此之前初始化。[PEP 508](https://www.python.org/dev/peps/pep-0508/#environment-markers) 给出了可用变量的列表。 (2认同)

cod*_*ape 13

setup.py:

from setuptools import setup
import sys

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

distutils.util.get_platform提供的信息比sys.platform您需要的更多:

>>> sys.platform
'linux2'
>>> distutils.util.get_platform()
'linux-i686'
Run Code Online (Sandbox Code Playgroud)

  • 据推测,这个逻辑生成的依赖项列表将被添加到我的egg元数据中,这意味着如果我在Windows上构建*egg,那么它将具有Windows依赖性,然后将无法在Linux上安装,而那些依赖项不是可用? (5认同)
  • 请注意,平台检查应该是``if sys.platform =='win32'``或者它将通过Mac OS X(*darwin*),请参阅http://stackoverflow.com/questions/2144748/is-it -safe使用的-SYS-平台Win32的检查上,64位蟒蛇 (3认同)
  • 这行不通。除非您正在进行源安装,否则安装时不会执行“setup.py”。它在包构建时执行。 (3认同)

Dan*_*nov 5

使用extras_require分发选项使“ win32支持”成为可选功能:

setup(
  ...
  extras_require={
    'win32': 'pywin32'
  },
  ...
)
Run Code Online (Sandbox Code Playgroud)

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

easy_install mypackage[win32]
Run Code Online (Sandbox Code Playgroud)

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

有关可选功能的更多信息,请参见此处