有没有办法告诉setuptools或分发以在特定平台上需要包?
在我的特定情况下,我使用的是readline
,它是Unix系统上标准库的一部分,但在Windows上我需要pyreadline
模块来替换该功能(参见{ {3}})。如果我只是把它放在要求中它也安装在Unix系统上,它完全没用。
答案 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系统)