某些Python包需要两个包中的一个作为依赖项。例如,Ghost.py
需要PySide
或PyQt4
。
是否可以在requirements.txt
文件中包含此类依赖项?是否有任何'或'使用这些文件的运算符?
如果没有,我该怎么办才能将这些要求添加到文件中,以便只安装其中一个?
答案 0 :(得分:2)
目前,pip的requirement.txt
和setuptools都没有直接允许这样的结构。两者都要求您指定要求列表。您可以限制需求的版本,但这都是。
在Python内部,您可以按如下方式处理这种情况:
try:
import dependency1
def do_it(x):
return dependency1.some_function(x)
except ImportError:
try:
import dependency2
def do_it(x)
return dependency2.another_function(x)
except ImportError:
raise ImportError('You must install either dependency1 or '
+ 'dependecy2!')
现在do_it
使用dependency1.some_function
或dependency2.another_function
,具体取决于可用的内容。
这仍然会让您了解如何指定您的要求。我看到两个选择:
requirements.txt
或setup.py
中正式指定要求,但要记录用户需要安装其中一个依赖项。如果您的软件设置需要额外的手动步骤(例如,不仅仅是pip install my_tool
),这种方法可能没问题。requirements.txt
或setup.py
。最后,你必须问自己为什么人们可能想要使用一个依赖关系而不是另一个:我通常不会关心我使用的库的依赖关系,因为(磁盘)空间很便宜并且(由于virtualenv)几乎没有不兼容的风险。因此,我甚至建议您考虑不支持两种不同的依赖关系来实现相同的功能。
答案 1 :(得分:1)
我会用一个小的Python脚本来完成这个
#!/usr/bin/env python
packages = 'p1 p2 p3'.split()
try:
import optional1
except ImportError: # opt1 not installed
try:
import optional2
except ImportError: # opt2 not installed
packages.append('optional2')
print(' '.join(packages))
让此脚本可执行
chmod +x requirements.py
最后像这样运行pip:
pip install $(requirements.py)
'$(requirements.py)'将执行requirements.py脚本并将其输出(在本例中为包列表)放入pip install ...