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

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

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

繁华开满天机 2019-07-27 15:15:45
带有修改环境的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贡献1155条经验 获得超0个赞

我认为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-28
?
潇潇雨雨

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

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

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-28
  • 3 回答
  • 0 关注
  • 449 浏览
慕课专栏
更多

添加回答

举报

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