2012-02-16 4 views
2

Я пытаюсь создать сценарий bash, содержащий некоторые переменные среды в python. Я сделал еще один шаг, чтобы сделать это. Но, кажется, что одна из переменных неверна, как видно из данного фрагмента.Обнаружение измененных переменных среды в 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' выдает ошибки, потому что вы назначили недействительный элемент body для функции« mc »во время выполнения инструкции' os.environ [key] = value'. Что вы пытаетесь сделать здесь? – hamstergene

+0

Я просто хочу, чтобы моя переменная окружения появлялась в среде python. Есть ли другой способ сделать это? Или как я буду иметь дело с значением переменной среды, которое охватывает несколько строк? – Shahzad

ответ

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

Спасибо большое. Я попробую этот метод и обновит вас с обратной связью. Кажется хорошим решением для меня. – Shahzad