Установить переменную окружения bash из скрипта Python - PullRequest
0 голосов
/ 24 октября 2018

Я использую 4 скрипта Python, которые вкратце должны устанавливать переменные окружения.

Дело в том, что использование os.environ['TEST'] (скажем) устанавливает его только для области действия скрипта Python, на котором он выполняется.

$ python test.py arg1
$ echo $TEST    < ------------

Возвращается пустым.В то время как печать из скрипта Python показывает значение в TEST

os.environ.get('TEST')

Как можно установить переменные среды из скрипта Python?

В качестве обходного пути, говоря иначе (альтернативный вопрос), как можно обмениваться данными между скриптами Python?

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Невозможно установить переменную среды для родительской (или исходной) среды процесса.

Некоторые сценарии bash выполняют это требование, выполняя команду source (которая запускает их внутри текущего bash,вместо порождения процесса bash), но это, очевидно, никогда не сработает со скриптом python, так как вы не можете выполнить скрипт python внутри самого процесса bash без запуска подпроцесса python.

Некоторые другие программы(например, ssh-agent) вывести необходимые назначения на стандартный вывод таким образом, чтобы их вывод можно было пропустить через eval в bash;это работает, хотя и требует взаимодействия вызывающей стороны (т. е. выполнение eval $(ssh-agent) вместо просто ssh-agent).

О вашем подвопросе - существует много способов обмена данными между процессами: аргументы командной строки,каналы, именованные каналы, файлы, сокеты, сигналы, базы данных (как SQL, так и без SQL), другие сервисы (веб и другие) ... Вам нужно будет указать свой сценарий более подробно, если вы попросите нас выбрать наиболее подходящийодин.Но это действительно должен быть новый вопрос, если до этого дойдет.

0 голосов
/ 24 октября 2018

Блок среды - это область памяти, уникальная для каждого процесса.Содержимое определяется способом запуска процесса.По умолчанию блок среды родительского процесса копируется в дочерний процесс.Дочерний элемент может изменять свой собственный блок среды, но не может изменять среду своего родителя.

Суть в том, что значения среды передаются только в одном направлении, от родителя к дочернему элементу.

Это относитсядля всех процессов, независимо от того, на каком языке написаны используемые ими программы.

"using os.environ ['TEST'] (скажем) устанавливает его только для области действия скрипта Python, которыйзапустить его. " - правильно

" Как можно установить переменные окружения из скрипта Python? " - теоретически отладчик, который, вероятно, должен быть написан на C, можетбыть присоединенным к процессу и изменить блок памяти.Это сложно, опасно (вы можете перезаписать не ту память), огромный риск для безопасности и кошмар обслуживания.Вы действительно не хотите туда идти.

Обмен данными между процессами - это большой вопрос, на самом деле не имеет значения, какой язык вы используете - принципы одинаковы.

Это зависит от типа данных (двоичных или текстовых), объема данных (несколько байтов или мегабайт), если данные передаются в обоих направлениях (может потребоваться синхронизация), если данные имеютбыть постоянным (может потребоваться файл или база данных) и, вероятно, миллион других вещей, о которых я не задумывался.

Вам необходимо более конкретно указать, какие данные передаются при каких обстоятельствах, в том числе ктопишу и кто читает.

0 голосов
/ 24 октября 2018

Похоже, вы совершенно не понимаете, как работают процессы и среды.

$ python test.py arg1
$ echo $TEST

Первая строка создаст новый процесс, и это совершенно отдельный процесс от самой оболочки.Хотя значения переменных среды могут быть унаследованы от среды родительского процесса, новый процесс имеет свою собственную среду.

К моменту выполнения второй строки процесс и окружение из первой строки уже не существуют!Вы не можете легко изменить среду процесса оболочки из процесса Python.

В качестве обходного пути, говоря иначе (альтернативный вопрос), как можно обмениваться данными между скриптами Python?

Не через среду - после завершения процесса Python, т.е. когда ваш скрипт завершает работу, его среда разрушается.«Альтернативный вопрос», возможно, слишком широк, поскольку существует множество способов обмена данными между процессами Python, но я предлагаю вам начать с чтения / записи данных в / из файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...