requirements.txt取决于python版本

我试图移植一个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文档中我找不到任何这方面的内容。 所以有人知道如何去做,或者甚至有可能吗?

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

 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', ], }, ) 

另见需求说明符 。

您可以创build多个需求文件,将这些常用软件包放在一个公共文件中,并使用-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

我不认为这是可能的,因为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) 

看我的回答https://stackoverflow.com/a/25078063/302521和这个脚本:; https : //gist.github.com/pombredanne/72130ee6f202e89c13bb