我正在尝试在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'
这个问题的可能解决方案是什么?
非常感谢
答案 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()