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

如何从Python运行具有干净环境的终端,python,linux,bash,Python,Linux,Bash,我需要从Python脚本运行一个终端,并在干净的环境中执行一个命令,就像我刚刚打开终端模拟器并在那里键入命令一样。但是我的脚本中有一些导出的变量,这些变量在这个终端中不可用。可以有任意数量的变量(其中一些甚至可以使用bash“export”命令在脚本外部设置),因此在运行终端之前,我无法手动删除它们 我尝试了常用的解决方案,该解决方案声称可以重置默认环境,但它不起作用。代码如下所示: import subprocess import os os.environ['X'] = 'Y' cmd

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


是否有任何解决方案可以解决此问题?

在调用
subprocess.Popen
时使用
env
参数:

subprocess.Popen([cmd], stdout=subprocess.PIPE, shell=True, env={})
这将在尽可能干净的环境中运行,但是可能会缺少许多可能需要的环境变量。您可能希望在启动脚本时缓存
os.environ
,然后使用该缓存填充
env
参数,以获得启动脚本时的相同环境变量


更新(为了清晰起见):请记住,当前环境总是复制到任何子进程(子进程无法访问/更改其父进程的环境),因此上述内容实质上是将当前环境删除并将其清空(提供空环境的子进程副本)如果子进程不能建立新的环境,它将永远不会知道脚本环境中的变量。部分缓解这种情况的一种方法是让bash(或从子进程调用的任何shell)加载概要文件和其他用户脚本,但它仍然无法获得全局环境。

我尝试了这种解决方案,但出于某种原因,如果我添加
env={}
终端根本无法打开,可能是因为某些重要变量在这种情况下被擦除。如果无法识别成功运行命令所需的环境变量,则在运行脚本后,将环境变量存储在某个缓存中(例如
env\u cache=os.environ.copy()
)然后稍后将此缓存用作
env
参数,以
Popen
。如果要删除环境。即使在执行脚本之前,您也不能在shell中进行更改,因为您没有对它们的跟踪。也就是说,请尝试将命令更改为在
bash-c
之后执行
env-i
(因此在命令本身内)-我有一种感觉,
bash-c
正在从概要文件和其他文件中提取您的环境变量,
$X
实际上是在其中一个文件中定义的。是的,我尝试了
gnome terminal-X bash-c env-I“echo$X;bash--noprofile--norc”
,但在这种情况下,终端立即出现并消失,什么也没发生。我试图用
touch
而不是
echo
来触摸该文件,但它不起作用。不,我的意思是将您的命令设置为:
gnome terminal-x“env-I bash--noprofile--norc”
或类似的内容(我不明白为什么您首先需要gnome terminal,我会以:
env-I bash--noprofile--norc
的身份运行您的命令)