2012-02-16 39 views
2

我想在python中找到包含一些环境变量的bash脚本。我跟着另一个线程去做。但是,似乎其中一个变量是畸形的,可以在给定的片段中看到。在python中检测到格式不正确的环境变量

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

这段代码从哪里来?如果在shell脚本中有语法错误,你不能修复shell脚本吗?但是这看起来像一个有效的shell函数,只能以不适合直接评估的形式打印。 – tripleee 2012-02-16 07:36:21

+0

这不是畸形的,那是它的价值超过几行。换行符是允许的。你的'ls'调用会抛出错误,因为你在执行'os.environ [key] = value'语句时已经为“mc”函数分配了无效的主体。你想在这里完成什么? – hamstergene 2012-02-16 09:13:40

+0

我只想让我的环境变量出现在python环境中。有没有其他方法可以做到这一点?或者我该如何处理跨越多行的环境变量的值? – Shahzad 2012-02-16 09:26:02

回答

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() 
+0

非常感谢ruakh。我会尝试这种方法,并会用反馈来更新你。看起来像是一个很好的解决方案。 – Shahzad 2012-02-17 11:23:38