有没有办法告诉 setuptools 或分发需要特定平台上的包?
在我的具体情况下,我使用readline
的是 Unix 系统标准库的一部分,但在 Windows 上,我需要该pyreadline
模块来替换该功能(参见这个问题)。如果我只是把它放在要求它也安装在完全没用的Unix系统上。
有没有办法告诉 setuptools 或分发需要特定平台上的包?
在我的具体情况下,我使用readline
的是 Unix 系统标准库的一部分,但在 Windows 上,我需要该pyreadline
模块来替换该功能(参见这个问题)。如果我只是把它放在要求它也安装在完全没用的Unix系统上。
虽然 Martijn Pieters 给出的答案在当时是完全有效的,但 Python 封装从那时起发生了很大变化。
分发包的首选格式是使用轮子*. 使用轮子在安装期间无法运行 Python 代码。
Wheel 使用PEP 0427中指定的元数据版本二。环境标记可用于指定特定于平台的依赖项。
Setuptools 允许将这些环境标记指定为extras_require
键。以下示例脚本依赖于pyreadline
Windows 系统和pyxdg
Linux 发行版。
#!/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的平台仍然可以安装你的包。
2013 年,当我第一次在这里写答案时,我们还没有PEP 496 – Environment Markers和PEP 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
但添加setuptools
和wheel
添加。从 2018 年 3 月发布的pip
10.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,
)
如果需要支持旧版本,其他答案是有效的并且可能更方便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_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中实现。使用它可以自动安装和更新构建系统要求。
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 系统)