Setuptools平台特定的依赖项

Man*_*ert 10 python setuptools

有没有办法告诉setuptools或分发需要特定平台上的包?

在我的特定情况下,我正在使用readline,它是Unix系统上标准库的一部分,但在Windows上我需要pyreadline模块来替换该功能(参见这个问题).如果我只是把它放在要求中它也安装在Unix系统上,它完全没用.

Rem*_*ing 19

虽然Martijn Pieters给出的答案在当时完全有效,但Python包装从那时起已经发生了很大的变化.

分发包的首选格式是使用wheel*.使用轮子在安装期间无法运行Python代码.

轮子使用PEP 0427中指定的元数据版本2 .环境标记可用于指定特定于平台的依赖项.

Setuptools允许将这些环境标记指定为extras_require键.以下示例脚本依赖于pyreadlineWindows系统和pyxdgLinux发行版.

#!/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'
        ]
    })
Run Code Online (Sandbox Code Playgroud)

*还释放一个sdist,所以不能使用轮子的平台仍然可以安装你的包.

  • 而不是'':sys_platform =="win32"'`,它更易读,更直观,''platform_system =="Windows"'`.而不是`':"linux"在sys_platform'中,你可以做''platform_system =="Linux"'`.这将包括`linux`和`linux2`.对于其他平台也是如此,mac是''platform_system =="Darwin"'等,等等.参考:[`PEP 508`](https://www.python.org/dev/peps/pep-0508/ #environment-markers)和[EasyBuilders](https://github.com/easybuilders/easybuild/wiki/OS_flavor_name_version) (3认同)
  • 这应该完全是公认的答案! (2认同)

Mar*_*ers 9

setup.py只是一个python脚本.您可以在该脚本中创建动态依赖项:

import platform

setup_requires = ['foo', 'bar']

if platform.system() == 'Windows':
    setup_requires.append('pyreadline')

setup(
    # ...
    setup_requires=setup_requires,
)
Run Code Online (Sandbox Code Playgroud)


AXO*_*AXO 6

其他答案是有效的,如果需要支持旧setuptools版本可能更方便,但有一些进步:

最新版本的setuptools接受PEP 508样式依赖项规范:

setup(
    # ...
    install_requires=[
        'pyreadline; platform_system == "Windows"',
    ],
)
Run Code Online (Sandbox Code Playgroud)

选择正确的参数:

  • install_requires:当前分发正常工作所需的其他发行版
  • extras_require:将可选功能的名称映射到其需求列表的字典
  • setup_requires:需要出现以使安装脚本正确运行的其他发行版注意:列出的项目setup_requires不会自动安装.如果它们本地不可用,则只需将它们下载到./.egs文件目录即可.

还有一种通过setup.cfg文件提供这些参数的替代方法.有关详细信息,请参阅文档.

PEP 518引入了一种新的更有效setup_requirespyproject.toml文件指定方式:

[build-system]
# Minimum requirements for the build system to execute.
requires = ['setuptools>"38.3.0"', 'wheel']  # PEP 508 specifications.
Run Code Online (Sandbox Code Playgroud)

该功能在pip 10.0.0b1中实现.使用它将能够自动安装和更新构建系统要求.