Обнаружение искаженных переменных среды в python - PullRequest
2 голосов
/ 16 февраля 2012

Я пытаюсь создать скрипт 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'

Какими могут быть возможные решения этой проблемы?

Большое спасибо

1 Ответ

1 голос
/ 16 февраля 2012

Вероятно, лучший способ сделать это - создать отдельную программу, которая записывает переменные среды так, чтобы она легко и однозначно обрабатывалась вашей собственной программой; затем вызовите эту программу вместо env. Используя стандартный pickle модуль , эта отдельная программа может быть такой простой:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...