我需要从我的Python脚本运行一个终端并在干净的环境中执行一个命令,好像我刚刚打开了终端模拟器并在那里输入了命令。但是我的脚本中有一些导出的变量在这个终端中不可用。可以有任意数量的变量(其中一些变量甚至可以使用bash'export'命令在脚本外部设置),因此我无法在运行终端之前手动删除它们。
我尝试了声称重置默认环境的常用解决方案,但它无效。代码如下所示:
import subprocess
import os
os.environ['X'] = 'Y'
cmd = 'gnome-terminal -x env -i bash -c "echo $X; bash --noprofile --norc"'
subprocess.Popen([cmd], stdout=subprocess.PIPE, shell=True)
输出仍然打印“Y”。当我尝试仅使用终端做同样的事情时,结果是相同的:
$ export X=Y
$ gnome-terminal -x env -i bash -c "echo $X; bash --noprofile --norc"
打开新终端并打印“Y”。
有没有解决问题的解决方案?
答案 0 :(得分:1)
在致电env
时使用subprocess.Popen
参数:
subprocess.Popen([cmd], stdout=subprocess.PIPE, shell=True, env={})
这将在尽可能干净的环境中运行,但是很多可能需要的环境变量将会丢失。您可能希望在启动脚本时缓存os.environ
,然后使用该缓存填充env
参数,以获得启动脚本时所具有的相同环境变量。
更新(为了清楚起见):请记住,当前环境始终复制到任何子流程(并且子流程无法访问/更改其父项的环境),因此上述内容基本上采用当前环境和空白它(给出一个空环境的子流程副本),如果子流程无法建立新环境,它将永远不会知道脚本环境中的变量。部分缓解这种情况的一种方法是实际让bash(或者你从子进程调用的任何shell)加载配置文件和其他用户脚本,但它仍然无法获得全局环境。