我相信在稍加修改的环境下运行外部命令是非常常见的情况。我就是这么做的:
import subprocess, os
my_env = os.environ
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
subprocess.Popen(my_command, env=my_env)
我有一种直觉,有更好的方法;看起来还好吗?
我相信在稍加修改的环境下运行外部命令是非常常见的情况。我就是这么做的:
import subprocess, os
my_env = os.environ
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
subprocess.Popen(my_command, env=my_env)
我有一种直觉,有更好的方法;看起来还好吗?
当前回答
这可能是一个解决方案:
new_env = dict([(k,(':'.join([env[k], v]) if k in env else v)) for k,v in os.environ.items()])
其他回答
我认为os. environment .copy()更好,如果你不打算修改操作系统。当前过程的环境:
import subprocess, os
my_env = os.environ.copy()
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
subprocess.Popen(my_command, env=my_env)
临时设置一个环境变量,而不必复制操作系统。envrion对象等,我这样做:
process = subprocess.Popen(['env', 'RSYNC_PASSWORD=foobar', 'rsync', \
'rsync://username@foobar.com::'], stdout=subprocess.PIPE)
在Python 3.5中,你可以这样做:
import os
import subprocess
my_env = {**os.environ, 'PATH': '/usr/sbin:/sbin:' + os.environ['PATH']}
subprocess.Popen(my_command, env=my_env)
这里我们得到了一个os的副本。environ和被重写的PATH值。
PEP 448(附加拆包概括)使之成为可能。
另一个例子。如果你有一个默认环境(即os.environ),并且你想用一个dict来覆盖默认值,你可以这样表达:
my_env = {**os.environ, **dict_with_env_variables}
这可能是一个解决方案:
new_env = dict([(k,(':'.join([env[k], v]) if k in env else v)) for k,v in os.environ.items()])
参数env接受一个字典。你可以简单地取os。environ,添加一个键(你想要的变量)(到dict的副本,如果你必须),并使用它作为Popen的参数。