Python,在使用Popen时更改当前shell环境变量?

2024-09-30 22:16:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含环境变量信息的XML,它通过python脚本设置到shell中。以下是XML的一个片段:

<envVar name='QTDIR'>/homeqt/libs.qt4/qt4.5.1</envVar>
<envVar name='MAKE'>which make</envVar>

这个片段的这一部分告诉我的python脚本设置环境变量QTDIR和MAKE。在

我关心的是如何设置上述变量。我知道我可以用操作系统环境要设置环境变量并执行以下操作:

^{pr2}$

但是我不能用它来设置MAKE变量,我必须执行命令“which MAKE”(以获得makeexecutable的路径)。我的目标是使用相同的方法/函数来设置每个变量。在

所以,我想做些类似的事情:

Popen("QTDIR=/homeqt/libs.qt4/qt4.5.1 ; export QTDIR", shell=True, stdout=PIPE, stderr=PIPE)
Popen("MAKE=which make ; export MAKE", shell=True, stdout=PIPE, stderr=PIPE)

但是如果我这样做,变量将只为子进程设置,而不是为当前shell设置。在

所以,我的问题是,有没有办法做我想做的事?我不想分析XML并做这样的事情:

(伪代码)

if QTDIR has normal value
    os.environ['QTDIR'] = "/homeqt/libs.qt4/qt4.5.1"
if MAKE has value to be executed
    p = Popen("which make", shell=True, stdout=PIPE, stderr=PIPE)
    stdout, stderr = p.communicate()
    os.environ['MAKE'] = stdout

Tags: whichmakestderrstdout环境变量xmlshelllibs
2条回答

你的陈述模棱两可:

<envVar name='QTDIR'>/homeqt/libs.qt4/qt4.5.1</envVar>
<envVar name='MAKE'>which make</envVar>

如何在MAKE=which make或{}之间作出决定:

^{pr2}$

如果xml文件是机器生成的,并且人们不经常查看/编辑这个文件,那么您可以使用一个详细的显式表示法,如suggested by @stefan。在

否则,可以使用更简洁简单的表示法:

QTDIR: /homeqt/libs.qt4/qt4.5.1
$MAKE: which make

下面是一个Python脚本,它将该格式解析为字典:

for line in file:
    name, sep, value = map(str.strip, line.partition(':'))
    if sep: # ':' is in the line           
       if name.startswith('$'):
          name = name[1:] # strip '$'
          value = subprocess.check_output(value, shell=True).strip()
       d[name] = value

或者你可以这样做,例如:

d = yaml.load(file) # yaml is as complex as xml, but less explicit i.e., worse
# and transform keys that start with '$' here

如果您需要更复杂的功能,xml格式可能是一种合理的回退。在

我将使用XML属性。在

<envVar name="MAKE" type="command">which make</envVar>
<envVar name="QTDIR" type="string">/homeqt/libs.qt4/qt4.5.1</envVar>

伪代码取决于您的xml库:

^{pr2}$

相关问题 更多 >