Python子流程/ Popen与修改后的环境
我相信,在略微修改环境下运行外部命令是非常普遍的情况。 这就是我倾向于这样做的原因:
import subprocess, os
my_env = os.environ
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
subprocess.Popen(my_command, env=my_env)
我有一种直觉,认为有更好的方法; 它看起来好吗?
我认为os.environ.copy()
更好,如果你不打算修改当前进程的os.environ:
import subprocess, os
my_env = os.environ.copy()
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
subprocess.Popen(my_command, env=my_env)
这取决于问题是什么。 如果要克隆和修改环境,解决方案可能是:
subprocess.Popen(my_command, env=dict(os.environ, PATH="path"))
但是这在一定程度上取决于被替换的变量是否是有效的Python标识符,它们通常是多少(您多久运行一次非字母数字+下划线的环境变量名称或以数字开头的变量?)。
否则,你可以写下如下内容:
subprocess.Popen(my_command, env=dict(os.environ,
**{"Not valid python name":"value"}))
在非常奇怪的情况下(你在环境变量名称中使用控制代码或非ASCII字符的频率是多少?)环境的键是你不能使用的bytes
(在python3上)甚至使用该构造。
正如你所看到的,这里使用的技术(特别是第一种)通常是有效的Python标识符,并且事先已知(在编码时),第二种方法有问题。 如果情况不是这样,你应该寻找另一种方法。
如果PATH
以某种方式未在原始环境中定义,则可以使用my_env.get("PATH", '')
而不是my_env["PATH"]
,但my_env["PATH"]
看起来不错。