只需要需求文件中的两个依赖项之一

时间:2016-07-11 18:38:40

标签: python python-2.7 pip requirements.txt

某些Python包需要两个包中的一个作为依赖项。例如,Ghost.py需要PySidePyQt4

是否可以在requirements.txt文件中包含此类依赖项?是否有任何'或'使用这些文件的运算符?

如果没有,我该怎么办才能将这些要求添加到文件中,以便只安装其中一个?

2 个答案:

答案 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_functiondependency2.another_function,具体取决于可用的内容。

这仍然会让您了解如何指定您的要求。我看到两个选择:

  1. 不要在requirements.txtsetup.py中正式指定要求,但要记录用户需要安装其中一个依赖项。如果您的软件设置需要额外的手动步骤(例如,不仅仅是pip install my_tool),这种方法可能没问题。
  2. requirements.txtsetup.py
  3. 中对您的首选要求进行硬编码

    最后,你必须问自己为什么人们可能想要使用一个依赖关系而不是另一个:我通常不会关心我使用的库的依赖关系,因为(磁盘)空间很便宜并且(由于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 ...