requirements.txt取决于python版本

时间:2013-10-24 07:09:42

标签: python pip

我正在尝试使用6将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文档中找不到任何相关内容。所以有人知道怎么做,或者甚至可能吗?

4 个答案:

答案 0 :(得分:86)

您可以requirements.txt使用environment markers来实现这一目标,因为pip 6.0

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

通过在setup.py

中声明额外要求,setuptools也支持它
setup(
    ...
    install_requires=[
        'six',
        'humanize',
    ],
    extras_require={
        ':python_version == "2.7"': [
            'ipaddress',
        ],
    },
)

另见requirement specifiersStrings表示相应Python命令的字符串版本。

答案 1 :(得分:8)

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

的pip需求文件中
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 requirements / python2.txt

答案 2 :(得分:0)

我不认为这是可能的,因为requirements.txt文件只是一个文本文件。我能想到的最接近的事情是在requirements.txt中注释掉包含上面的注释,声明应该为python2.6安装它。也许值得添加一些代码来检查python版本?

import sys
if sys.version_info.major == 2:
try:
    import blah
except ImportError:
    sys.stderr.write("Yo, pip install blah")
    sys.exit(1)

答案 3 :(得分:-1)