2012-02-16 8 views
2

私はPythonでいくつかの環境変数を含むbashスクリプトをソースしようとしています。私はそれを行うために他のスレッドに従った。しかし、このスニペットに見られるように、変数の1つが不正な形式になっているようです。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

スニペットはどこから来たのですか?シェルスクリプトに構文エラーがある場合は、シェルスクリプトを修正できませんか?しかし、これは有効なシェル関数のように見え、直接評価には適していない形式でのみ表示されます。 – tripleee

+0

これは不正な形式ではありません。つまり、その値が複数の行にまたがっています。改行は許可されます。あなたの 'ls'呼び出しは' os.environ [key] = value'文の実行中に無効な本体を "mc"関数に割り当てているのでエラーをダンプします。ここで何を達成しようとしていますか? – hamstergene

+0

自分の環境変数をpython環境に表示したいだけです。これを行う他の方法はありますか?あるいは、私は複数の行にまたがる環境変数の値をどう扱うつもりですか? – Shahzad

答えて

1

たくさん

おかげでこれを行うための最善の方法は、簡単かつ明確に独自のプログラムによって処理されるように、環境変数を書き出し、別のプログラムを作成することです。 envの代わりにというプログラムをプログラムと呼びます。別のプログラムがこのような単純なものができることを、the standard pickle moduleを使用する:どちらの場合も

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

:あなたはどちらか、独自の.pyファイルに保存するか、あるいはbashコマンドに直接置くことができます

import os 
import sys 
import 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

ありがとうalot ruakh。私はこの方法を試し、あなたにフィードバックを更新します。私には良い解決策のようです。 – Shahzad