Я открываю консоль Python и запускаю
>>> import os
>>> os.system("export aaa=123")
>>> os.environ["aaa"]
Я вижу ключевую ошибку. Почему это? Как я могу сохранить переменные env на протяжении всего процесса?
🤔 А знаете ли вы, что...
В Python есть множество библиотек и фреймворков для разработки веб-приложений.
Установите переменную среды в процессе Python
os.environ['aaa'] = "123"
Сейчас или позже вы можете получить к нему доступ как к обычной переменной среды.
print(os.environ['aaa'])
os.system()
создает подоболочку. Подоболочки не имеют доступа к своей родительской среде (она скопирована). Они не могут его изменить. Вы можете изменить свою текущую среду (не дочернюю) и наследовать ее подоболочкам:
>>> import os
>>> os.environ['abc'] = '123'
>>> os.system('echo $abc')
123
Как правило, дочерняя оболочка не может напрямую использовать или изменять переменные среды в родительской оболочке. Когда создается дочерний процесс, он получает копию переменных среды родительского процесса, но любые изменения, внесенные в дочерний процесс, не влияют на родительский процесс.
Вы задумывались, почему вы хотите это сделать? Мне бы не хотелось, чтобы мои дочерние процессы могли изменять переменные среды... это проблема «запаха кода».
Подумайте, если вам нужно передавать значения между различными подпроцессами в скрипте Python, используя модуль multiprocessing и, в частности класс multiprocessing.Queue
Это обеспечивает питонический способ передачи данных между запущенными процессами Python, что облегчает многие головные боли, связанные с перемещением собственной очереди сообщений или даже необходимостью установки/использования инструмента корпоративного уровня, такого как Kafka.
Если вам это не нравится, я бы порекомендовал вам сохранить в файловой системе файл, содержащий магические значения, которые вам нужно передавать между процессами.
Доктор; вот: если вы можете это осуществить, это, вероятно, все равно неправильный поступок.
Как говорят другие, подоболочка не может влиять на среду супероболочки. Но не все потеряно, если супероболочке позволят сотрудничать.
Большинство программ, которым необходимо изменить среду супероболочки, работают следующим образом: они печатают определения переменных и ожидают их выполнения в супероболочке. В известном примере ssh-agent
следует использовать следующим образом:
$ eval `ssh-agent`
ssh-agent
выводит что-то вроде
SSH_AUTH_SOCK=/tmp/ssh-XXXXXXkZD1hM/agent.200830; export SSH_AUTH_SOCK;
SSH_AGENT_PID=200831; export SSH_AGENT_PID;
echo Agent pid 200831;
и когда вы применяете к нему встроенную оболочку eval
, переменные определяются в текущей оболочке. Вы можете применить что-то подобное для себя:
import os
import subprocess
output = subprocess.check_output(
"echo aaa=123; echo bbb=456",
shell=True, encoding='utf-8',
)
vars = { k: v for k, v in [row.split('=', 1) for row in output.splitlines()] }
os.environ.update(vars)
print(os.environ["aaa"])
# => 123
print(os.environ["bbb"])
# => 456
Обратите внимание, что это адаптировано к описанному вами сценарию: передача переменных из подоболочки в os.environ
вызывающей программы Python. Как справедливо указывает VonWooDSoN, существуют и другие способы взаимодействия как между двумя процессами Python (например, multiprocessing
), так и между гетерогенными процессами (например, Redis).