12

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

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

4

4 回答 4

22

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

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

Wheel 使用PEP 0427中指定的元数据版本二。环境标记可用于指定特定于平台的依赖项。

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

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

于 2015-10-05T18:36:06.040 回答
9

2013 年,当我第一次在这里写答案时,我们还没有PEP 496 – Environment MarkersPEP 508 – Dependency specification for Python Software Packages。既然我们这样做了,答案是:将环境标记放在您的setup_requires:

setup_requires = [
    'foo',
    'bar',
    'pyreadline; sys_platform == "win32"',
]

setup(
    # ...
    setup_requires=setup_requires,
)

setuptools从 2016 年 5 月发布的20.6.8 开始支持此功能(支持在20.5 版本中引入,但在中间版本中被短暂禁用)。

请注意,setuptools 将在执行时用于安装这些需求,这在用于安装项目easy_install时很难配置。pip

最好不要使用 setuptools 来处理构建时依赖项,并使用遵循PEP 518 –指定 Python 项目的最低构建系统要求pyproject.toml的建议的文件。使用带有内置依赖项的 PEP 518 构建系统,意味着创建一个看起来像这样的文件:pyproject.toml

[build-system]
requires = [
    "setuptools",
    "wheel",
    "foo",
    "bar",
    "pyreadline; sys_platform == "win32",
]

这是相同的列表,setup_requires但添加setuptoolswheel添加。从 2018 年 3 月发布的pip10.0.0版本开始支持此语法。

从 2013 年开始,我的旧答案如下。


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

import sys

setup_requires = ['foo', 'bar']

if sys.platform() == 'win32':
    setup_requires.append('pyreadline')

setup(
    # ...
    setup_requires=setup_requires,
)
于 2013-04-17T08:49:50.777 回答
6

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

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

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

选择正确的参数:

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

还有另一种通过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.

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

于 2018-01-07T11:30:28.170 回答
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(对于使用 的 linux 系统python2)、linux(对于使用 的 linux 系统python3)、darwin(对于 MacOS 系统)

于 2018-07-08T02:12:23.520 回答