install_requires基于python版本

iTa*_*ayb 39 python distutils setuptools distribute install-requires

我有一个模块可以在python 2和python 3上工作.在Python <3.2中我想安装一个特定的包作为依赖.对于Python> = 3.2.

就像是:

 install_requires=[
    "threadpool >= 1.2.7 if python_version < 3.2.0",
 ],
Run Code Online (Sandbox Code Playgroud)

怎么能做到这一点?

unh*_*ler 70

setuptools使用环境标记支持此功能.

install_requires=[
    'enum34;python_version<"3.4"',
    'pywin32 >= 1.0;platform_system=="Windows"'
]
Run Code Online (Sandbox Code Playgroud)

官方文档中详细说明了这一点.根据更改日志在v20.5中添加,但实施在v20.8.1之前不稳定(这只是15天的差距).


原始答案(仍然有效,但将来可能会被弃用):

setuptoolsextras_require论证中使用支持.

格式如下:

extras_require={
    ':python_version=="2.7"': ["mock"],
},
Run Code Online (Sandbox Code Playgroud)

它将支持其他比较运算符.


遗憾的是,文档中没有提到它.在寻找答案时,我发现PEP-426在谈论"环境标志".通过这句话,我能够找到一个具有以下注释的setuptools票证:

我已经成功地使用了标记功能来有选择地和声明性地要求依赖.有关示例,请参阅backports.unittest_mock.通过'extras',mock将是必需的,但仅限于Python 2.当我可以依赖Setuptools 17.1时,我可以将该依赖项更改为python_version < "3.3".


sle*_*cal 9

这里已经讨论,看来推荐的方法是测试你setup.py使用的Python版本sys.version_info;

import sys

if sys.version_info >= (3,2):
    install_requires = ["threadpool >= 1.2.7"]
else:
    install_requires = ["threadpool >= 1.2.3"]

setup(..., install_requires=install_requires)
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案很脆弱,有许多'pip`和`wheel`包的组合.当pip代表您构建轮子时,计算的install_requires列表将写入轮子元数据中,然后缓存的轮子可能会用在不同的Python版本上. (13认同)