繁体   English   中英

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

[英]Python: Exporting environment variables in subprocess.Popen(..)

我在调用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应该为子进程设置环境,但显然没有。 有关如何解决此问题的任何建议?

命令行上环境变量的替换是由 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

对于 Python 3.5 及更新版本,您可以使用 解包概括,例如:

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

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

看到这个答案

如果你想这样做并将它们永远设置到一个用户帐户中,你可以使用 setx 但如果你想要全局你可以使用 setx /M 但为此你可能需要提升,(我使用 windows 为例,(对于 linux我认为您可以使用导出)

在窗户里

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

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

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM