Как сделать переменную env подоболочки доступной в основной консоли Python оболочки?

Я открываю консоль Python и запускаю

>>> import os
>>> os.system("export aaa=123")
>>> os.environ["aaa"]

Я вижу ключевую ошибку. Почему это? Как я могу сохранить переменные env на протяжении всего процесса?

Непонятно, чего именно вы хотите достичь. Должен ли ваш дочерний процесс изменить среду своего родительского процесса или всех своих родительских процессов или всех процессов, запущенных на вашем компьютере? К счастью, Linux устроен не так. Если вы хотите, чтобы два процесса совместно использовали часть информации, рассмотрите возможность использования общей памяти.

user1934428 20.08.2024 08:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
53
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Установите переменную среды в процессе 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).

Другие вопросы по теме