requirements.txt取决于python版本

aqu*_*tae 71 python pip

我正在尝试使用六个将python2包移植到python3(不是我自己的),以便它与两者兼容.但是,requirements.txt中列出的一个软件包现在包含在python3 stdlib中,而pypi版本在python3中不起作用,所以我想有条件地排除它.在setup.py中这样做很容易,我可以这样做:

if sys.version_info[0] == 2:
    requirements += py2_requirements
else:
    requirements += py3_requirements
Run Code Online (Sandbox Code Playgroud)

但是我希望requirements.txt能够反映出正确的列表.我在pip文档中找不到任何相关内容.所以有人知道怎么做,或者甚至可能吗?

Jia*_*ang 107

您可以使用环境标志,以实现这一点requirements.txt,因为pip 6.0:

SomeProject==5.4; python_version < '2.7'
SomeProject; sys_platform == 'win32'
Run Code Online (Sandbox Code Playgroud)

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

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

另请参见需求说明符.

  • 更新:[PEP 496 -- 环境标记](https://www.python.org/dev/peps/pep-0496/) 已被 [PEP 508 -- Python 软件包的依赖规范](https://www.python.org/dev/peps/pep-0496/) 取代/www.python.org/dev/peps/pep-0508/),它完全指定了依赖声明语法,包括[环境标记的语法](https://www.python.org/dev/peps/pep-0508 /#环境标记)。 (4认同)

Leo*_*o.Z 8

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

requirements/
  base.txt
  python2.txt
  python3.txt
Run Code Online (Sandbox Code Playgroud)

python2.txt:

-r base.txt
Django==1.4 #python2 only packages
Run Code Online (Sandbox Code Playgroud)

python3.txt:

-r base.txt
Django==1.5 #python3 only packages
Run Code Online (Sandbox Code Playgroud)

pip install -r requirements/python2.txt

  • 这显然不是正确的方法,请检查这个家伙的答案http://stackoverflow.com/a/33451105/99834 (3认同)