2012-02-16 72 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