提问者:小点点

基于env变量的pip要求. txt条件或环境标记


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

我已经能够控制环境标记所需的大部分内容,但我所知道的所有标记都只适用于Python基本上预先定义的特定值。

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

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

非常感谢。


共2个答案

匿名用户

环境变量没有真正的方法。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

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

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

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

-r requirements.txt

然后列出额外的特殊依赖项。然后,在每个环境中,您可以设置一个env var,我们称之为$PLATFORM,并运行这样的命令来安装依赖项:

$ pip install -r requirements.$PLATFORM.txt

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

Foo
Bar
Baz

然后您可以有一个约束文件,同样适用于每个平台,它将列出特定的版本要求。例如,您可以拥有具有以下内容的约束. 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没有本地解决方案。

匿名用户

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

基本上,我做了类似以下(部分)示例的事情,它允许我根据脚本中的需要定义包,并且仍然传入要求. txt和约束.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)

相关问题