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"]看起来不错。

链接地址: http://www.djcxy.com/p/77129.html

上一篇: Python subprocess/Popen with a modified environment

下一篇: Popen log management question