requirements.txt取决于python版本


89

我正在尝试使用六个将python2软件包移植到python3(不是我自己的),以使其与两者兼容。但是,requirements.txt中列出的软件包之一现已包含在python3 stdlib中,而pypi版本在python3中不起作用,因此我想有条件地将其排除。在setup.py中执行此操作很容易,我可以执行以下操作:

if sys.version_info[0] == 2:
    requirements += py2_requirements
else:
    requirements += py3_requirements

但我也希望Requirements.txt也能反映正确的列表。我在pip文档中找不到任何内容。有人知道怎么做,或者甚至有可能吗?


1
请更改对stackoverflow.com/a/33451105/99834的接受响应-无疑是实现此目标的正确方法。
索林

Answers:


133

您可以使用环境标记来实现此目的,requirements.txt因为pip 6.0

SomeProject==5.4; python_version < '2.7'
SomeProject; sys_platform == 'win32'

setuptools也通过在setup.py以下方面声明额外要求来支持它:

setup(
    ...
    install_requires=[
        'six',
        'humanize',
    ],
    extras_require={
        ':python_version == "2.7"': [
            'ipaddress',
        ],
    },
)

另请参阅需求说明符。而Strings则是相应的Python命令的字符串版本。


真好!我该怎么做sys.platform == "win32"?我尝试使用:sys.platform == "win32",但我从一开始的“无效环境标志”错误setup()功能
安德烈·卡伦

3
更新:PEP 496-环境标记已被PEP 508-Python软件包的相关性规范所取代,该规范完全指定了相关性声明语法,包括环境标记语法
jkdev

10

您可以创建多个需求文件,将这些通用软件包放在一个通用文件中,并将它们包含在另一个pip需求文件中, -r file_path

requirements/
  base.txt
  python2.txt
  python3.txt

python2.txt:

-r base.txt
Django==1.4 #python2 only packages

python3.txt:

-r base.txt
Django==1.5 #python3 only packages

pip install -r要求/python2.txt

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.