在python中检测到格式错误的环境变量

时间:2012-02-16 06:43:56

标签: python linux bash environment-variables

我正在尝试在python中获取包含一些环境变量的bash脚本。我跟着另一个线程去做。但是,似乎其中一个变量格式不正确,如给定的片段所示。

COLORTERM=gnome-terminal
mc=() {  . /usr/share/mc/mc-wrapper.sh
}
_=/usr/bin/env

我使用以下代码设置当前环境。

import os
import pprint
import subprocess

command = ['bash', '-c', 'source init_env && env']

proc = subprocess.Popen(command, stdout = subprocess.PIPE)

for line in proc.stdout:
    (key, _, value) = line.partition("=")
    os.environ[key] = value

proc.communicate()

如果我改变上面的代码有点像条件:

for line in proc.stdout:
    (key, _, value) = line.partition("=")
    if not value:
        continue
    os.environ[key] = value

然后事情正在发挥作用但环境已损坏,因为一个缺少的括号,从环境变量的片段可以看出括号出现在新行上。由于这种损坏,如果我运行其他命令,如

os.system("ls -l")

它给了我以下错误

sh: mc: line 1: syntax error: unexpected end of file
sh: error importing function definition for `mc'

这个问题的可能解决方案是什么?

非常感谢

1 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法可能是创建一个单独的程序,以一种可由您自己的程序轻松且明确地处理的方式写出环境变量;然后调用那个程序而不是env。使用the standard pickle module,单独的程序可以像这样简单:

import os
import sys
import pickle

pickle.dump(os.environ, sys.stdout)

您可以将其保存到自己的.py文件中,也可以直接放入Bash命令中:

python -c 'import os, sys, pickle; pickle.dump(os.environ, sys.stdout)'

在任何一种情况下,您都可以像这样处理其输出:

import os
import pprint
import subprocess
import pickle

command = [
      'bash',
      '-c',
      'source init_env && ' +
         'python -c "import os, sys, pickle; ' +
                    'pickle.dump(os.environ, sys.stdout)"'
]

proc = subprocess.Popen(command, stdout = subprocess.PIPE)

for k, v in pickle.load(proc.stdout).iteritems():
    os.environ[k] = v

proc.communicate()