如何从Python运行具有干净环境的终端

时间:2017-02-16 14:17:27

标签: python linux bash

我需要从我的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”。

有没有解决问题的解决方案?

1 个答案:

答案 0 :(得分:1)

在致电env时使用subprocess.Popen参数:

subprocess.Popen([cmd], stdout=subprocess.PIPE, shell=True, env={})

这将在尽可能干净的环境中运行,但是很多可能需要的环境变量将会丢失。您可能希望在启动脚本时缓存os.environ,然后使用该缓存填充env参数,以获得启动脚本时所具有的相同环境变量。

更新(为了清楚起见):请记住,当前环境始终复制到任何子流程(并且子流程无法访问/更改其父项的环境),因此上述内容基本上采用当前环境和空白它(给出一个空环境的子流程副本),如果子流程无法建立新环境,它将永远不会知道脚本环境中的变量。部分缓解这种情况的一种方法是实际让bash(或者你从子进程调用的任何shell)加载配置文件和其他用户脚本,但它仍然无法获得全局环境。