Setuptools平台特定的依赖项

时间:2013-04-17 08:39:58

标签: python setuptools

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

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

4 个答案:

答案 0 :(得分:18)

虽然当时Martijn Pieters给出的answer完全有效,但Python包装自那时起发生了很大变化。

分发软件包的首选格式是使用wheels *。使用轮子在安装过程中无法运行Python代码。

轮次使用PEP 0427中指定的元数据版本2。 Environment markers可用于指定特定于平台的依赖项。

Setuptools允许将这些环境标记指定为extras_require个键。以下示例脚本取决于Windows系统的pyreadline和Linux发行版的pyxdg

#!/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'
        ]
    })

*同时发布一个sdist,所以不能使用滚轮的平台仍然可以安装你的包。

答案 1 :(得分:8)

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

import platform

setup_requires = ['foo', 'bar']

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

setup(
    # ...
    setup_requires=setup_requires,
)

答案 2 :(得分:6)

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

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

setup(
    # ...
    install_requires=[
        'pyreadline; platform_system == "Windows"',
    ],
)

选择正确的参数:

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

还有一种通过setup.cfg文件提供这些参数的替代方法。 See the documentation for more info

PEP 518引入了一种新的更有效的方法来指定setup_requires文件中的pyproject.toml

[build-system]
# Minimum requirements for the build system to execute.
requires = ['setuptools>"38.3.0"', 'wheel']  # PEP 508 specifications.

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

答案 3 :(得分:1)

from setuptools import setup


setup(
    install_requires=(['pymsgbox', 'PyTweening>=1.0.1', 'Pillow', 'pyscreeze']
                    + ["python3-xlib; sys_platform == linux"]
                    + ["python-xlib; sys_platform == linux2"]
                    + ["pyobjc-core; sys_platform == darwin"]
                    + ["pyobjc; sys_platform == darwing"]
                    ),
)

这将安装特定版本的库,具体取决于其linux2(对于使用python2的Linux系统),linux(对于使用python3的Linux系统), darwin(对于MacOS系统)