10

有没有办法在 pip requirements.txt 文件中指定基于环境变量值的条件安装?

我已经能够使用环境标记来控制我需要的大部分内容,但是我所知道的所有标记仅适用于基本上由 python 预定义的特定值。

例如,我希望能够控制 RHEL 5.3 与 RHEL 6.3 与 RHEL 6.6 等的软件包安装。也基于其他标准。

如果我可以在 results.txt 文件中指定一个环境变量,该变量将根据我在运行 pip 之前设置的值进行检查,那将是完美的。这似乎是可取且直接的功能。到目前为止,我没有太多运气找到关于环境标记的全面讨论,所以我希望我只是错过了一些关键信息:-)

非常感谢。

4

2 回答 2

6

没有真正的方法可以使用环境变量来做到这一点。Pip 需求文件基本上只是文件中列出的pip install参数列表。因此,如果您的需求文件如下所示:

Foo==1.1.0
Bar==0.1.0
Baz==2.0.1

从逻辑上讲,pip 正在这样做:

pip install Foo==1.1.0
pip install Bar==0.1.0
pip install Baz==2.0.1

不幸的是,在这种情况下,无法应用环境变量。

这个问题有几个解决方案。

第一,您可以有一个基本需求文件,例如requirements.txt,列出所有平台的常见依赖项。然后,您可以拥有单独的需求文件,例如requirements.rhel53.txt,requirements.rhel63.txt等。每个文件的顶部都可以将其作为第一行:

-r requirements.txt

然后是额外的特殊依赖列表。然后,在每个环境中,您可以设置一个 env var,让我们调用它$PLATFORM,然后运行如下命令来安装依赖项:

$ pip install -r requirements.$PLATFORM.txt

或者,您可以使用约束文件。您requirements.txt只会列出没有版本的依赖项:

Foo
Bar
Baz

然后你可以有一个约束文件,同样适用于每个平台,它会列出特定的版本要求。例如,你可以有constraints.rhel53.txt这样的:

Foo==1.1.0
Bar==0.1.0
Baz==2.0.1

再一次,你设置了一个 env var,然后运行如下命令:

$ pip install -r requirements.txt -c constraints.$PLATFORM.txt

这是一个麻烦的解决方案,但这是处理它的一种方式。不幸的是,pip 没有本地解决方案。

于 2016-02-12T02:01:47.610 回答
1

我最终得到了一个类似于我在中找到的脚本解决方案: 有没有一种方法可以为基于平台的 Python 应用程序提供条件 requirements.txt 文件?

基本上,我做了类似以下(部分)示例的操作,它允许我在脚本中根据需要定义包,并且仍然传入 requirements.txt 和 constraints.txt 文件。我是 Python 新手,所以请原谅(或评论)任何不太理想的编码实践:

import pip, sys, getopt

def install(options, packages):
    pipargs = options + packages
    pip.main(pipargs)

constraints_file = ''
requirements_file = ''

try:
    opts, args = getopt.getopt(sys.argv[1:],"hr:c:",["help","requirements-file=","constraints-file="])
except getopt.GetoptError:
    print_usage()
    sys.exit(2)
for opt, arg in opts:
    if opt in ("-h", "--help"):
       print_usage()
       sys.exit()
    elif opt in ("-r", "--requirements-file"):
        requirements_file = arg
    elif opt in ("-c", "--constraints-file"):
        constraints_file = arg

base_pkgs = [
    "nose>=1.3.4",
    "wheel",
    "pytz"
]

foo_pkgs = [
    "Pygments; python_version == '2.7'",
    "rednose; python_version == '3.5'",
]

bar_pkgs = [
    "six",
]

if __name__ == '__main__':

    from os import environ as env

    myvar = env.get('MYVAR')
    if(myvar == 'foo'):
        mypkgs = foo_pkgs
    elif(myvar == 'bar'):
        mypkgs = bar_pkgs
    else:
        mypkgs = ''

    pkglist = base_pkgs + mypkgs

    pipoptions = [  'install',
                    '--upgrade',
                    '--force-reinstall'
                 ]

    if(constraints_file):
        pipoptions += ['-c', constraints_file]
    if(requirements_file):
        pipoptions += ['-r', requirements_file]

    install(pipoptions, pkglist)
于 2016-02-15T22:57:38.977 回答