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

时间:2014-10-30 01:48:26

标签: python python-2.7 environment-variables

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

我的目标是运行一个脚本,该脚本使用根据我的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应该为子流程设置环境,但显然不是。有关如何纠正此问题的任何建议?

4 个答案:

答案 0 :(得分:33)

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

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

但这并不意味着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

答案 1 :(得分:8)

对于Python 3.5及更高版本,您可以使用unpacking generalizations,例如:

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

答案 2 :(得分:3)

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

请参阅this answer

答案 3 :(得分:0)

如果您想这样做并将它们永久设置为用户帐户,您可以使用 setx 但如果您想要全局,您可以使用 setx /M 但为此您可能需要提升,(我使用 Windows 作为示例, (对于 linux 你可以使用 export 我认为)

在窗口中

import subprocess
exp = 'setx hi2 "youAsWell"'
subprocess.Popen(exp, shell=True).wait()

运行后,您可以转到环境并查看它们是如何添加到我的用户环境中的

enter image description here