有没有办法在基于环境变量值的pip要求. txt文件中指定条件安装?
我已经能够控制环境标记所需的大部分内容,但我所知道的所有标记都只适用于Python基本上预先定义的特定值。
例如,我希望能够控制RHEL 5.3与RHEL 6.3与RHEL 6.6等的包安装。也基于其他标准。
如果我能在结果. txt文件中指定一个环境变量,该变量将根据我在运行pip之前设置的值进行检查,那将是完美的。这似乎是可取的和直接的功能。到目前为止,我还没有找到关于环境标记的全面讨论,所以我希望我刚刚错过了一些关键信息:-)
非常感谢。
环境变量没有真正的方法。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)