我正在尝试使用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文档中找不到任何相关内容。所以有人知道怎么做,或者甚至可能吗?
答案 0 :(得分:86)
您可以requirements.txt
使用environment markers来实现这一目标,因为pip 6.0
:
SomeProject==5.4; python_version < '2.7'
SomeProject; sys_platform == 'win32'
通过在setup.py
:
setup(
...
install_requires=[
'six',
'humanize',
],
extras_require={
':python_version == "2.7"': [
'ipaddress',
],
},
)
另见requirement specifiers。 Strings表示相应Python命令的字符串版本。
答案 1 :(得分:8)
您可以创建多个需求文件,将这些常用软件包放在一个公共文件中,并将它们包含在另一个使用-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 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)