为了账号安全,请及时绑定邮箱和手机立即绑定

带有修改环境的Python子进程/Popen

带有修改环境的Python子进程/Popen

小唯快跑啊 2019-07-17 14:43:41
带有修改环境的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)我有一种直觉,认为有更好的方法,它看起来还好吗?
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

我认为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)


查看完整回答
反对 回复 2019-07-17
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

这取决于问题是什么。如果要克隆和修改环境,一个解决方案可以是:

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你甚至不能(在python 3上)使用那个构造。

正如您所看到的,这里使用的技术(特别是第一种)在环境密钥上的好处通常是有效的python标识符,而且在编码时也知道(在编码时),第二种方法存在问题。如果情况并非如此,你应该去找另一种方法.


查看完整回答
反对 回复 2019-07-17
?
慕沐林林

TA贡献2016条经验 获得超9个赞

使用Python3.5,您可以这样做:

import osimport subprocess

my_env = {**os.environ, 'PATH': '/usr/sbin:/sbin:' + os.environ['PATH']}subprocess.Popen(my_command, env=my_env)

在这里,我们最终得到了一份os.environ被推翻PATH价值。

这是由佩普448(额外的解压概括)。

另一个例子。如果您有默认环境(即os.environ),并且您想要覆盖默认值的DICT,您可以这样表示它:

my_env = {**os.environ, **dict_with_env_variables}


查看完整回答
反对 回复 2019-07-17
  • 3 回答
  • 0 关注
  • 693 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信