2014-10-30 240 views
16

我在设置环境变量时遇到问题,请致电subprocess.Popen。环境变量似乎没有被设置。关于如何正确设置Python命令行调用的环境变量的任何建议?Python:在subprocess.Popen中导出环境变量(..)

我的目标是运行使用从我的Python代码确定的环境变量的脚本:

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

但脚本反应仿佛变量从未设置

这里是我的尝试测试中,使用Python的交互式解释:

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

,输出是:

"$TEST_VARIABLE" 
0 

我认为env=d应该为子过程设置环境,但它显然没有。有关如何解决此问题的任何建议?

回答

23

在命令行上环境变量的替代是由shell完成,而不是通过/斌/回声。所以,你需要在shell中运行的命令来获得替代:

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

这并不意味着环境变量不是当shell=False,但是设置。即使没有shell=True,可执行文件也会看到参数env设置的环境变量。

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 
2

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

请看看[这里]:1

+1

的问题是不是环境而是替代,如解释由接受的答案。 – 2016-08-22 16:11:19

+0

确实如此,但帖子的标题显示为“导出”,所以这很有用。 – gerardw 2017-07-31 14:45:38

2

对于Python 3.5和更高版本,可以使用unpacking generalizations,如:例如,dateTZ环境变量影响

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