Python:在subprocess.Popen(..)中导出环境变量

mod*_*tos 28 python environment-variables python-2.7

我在调用时设置环境变量时遇到问题subprocess.Popen.环境变量似乎没有设置.有关如何为Python命令行调用正确设置环境变量的任何建议?

我的目标是运行一个脚本,该脚本使用根据我的Python代码确定的环境变量:

d = dict(os.environ)
d["TEST_VARIABLE"] = str(1234)
subprocess.Popen('/usr/bin/mybinary', env=d).wait()
Run Code Online (Sandbox Code Playgroud)

但脚本的反应就像从未设置变量一样

这是我尝试使用Python的交互式解释器进行测试:

d = dict(os.environ)
d["TEST_VARIABLE"] = str(1234)
subprocess.Popen(['/bin/echo', '$TEST_VARIABLE'], env=d).wait() 
Run Code Online (Sandbox Code Playgroud)

输出是:

"$TEST_VARIABLE"
0
Run Code Online (Sandbox Code Playgroud)

我认为env=d应该为子进程设置环境,但显然没有.有关如何纠正此问题的任何建议?

unu*_*tbu 36

在命令行上替换环境变量是由shell完成的,而不是由/ bin/echo完成的.所以你需要在shell中运行命令来获得替换:

In [22]: subprocess.Popen('/bin/echo $TEST_VARIABLE', shell=True, env=d).wait()
1234
Out[22]: 0
Run Code Online (Sandbox Code Playgroud)

但是,这并不意味着未设置环境变量shell=False.即使没有shell=True,可执行文件也会看到env参数设置的环境变量.例如,dateTZ环境变量的影响:

In [23]: subprocess.Popen(["date"], env={'TZ': 'America/New_York'}).wait()
Wed Oct 29 22:05:52 EDT 2014
Out[23]: 0

In [24]: subprocess.Popen(["date"], env={'TZ': 'Asia/Taipei'}).wait()
Thu Oct 30 10:06:05 CST 2014
Out[24]: 0
Run Code Online (Sandbox Code Playgroud)


ide*_*n42 8

对于Python 3.5及更高版本,您可以使用解包通用化,例如:

env = {
    **os.environ,
    "TEST_VARIABLE": str(1234),
}
subprocess.Popen('/usr/bin/mybinary', env=env).wait()
Run Code Online (Sandbox Code Playgroud)


Avi*_*abu 7

您应该使用os.environ.copy()它来使其发挥作用。它创建整个环境字典的副本,您可以在将其传递到子进程之前对其进行修改,而无需修改当前进程环境。

看到这个答案

  • 问题不在于环境,而在于替代,正如已接受的答案所解释的那样。 (2认同)