Эквивалентность оболочки os.environ в Python?

#python #python-3.x #bash #shell

#python #python-3.x #bash #оболочка

Вопрос:

Есть ли

 os.environ["MYVAR"] = 'hello'
  

экспортировать во все дочерние процессы или только в текущий процесс? Другими словами, что из следующего эквивалентно?

 export MYVAR=hello
  

или

 MYVAR=hello
  

Комментарии:

1. Что показали ваши эксперименты?

2. Согласно официальной документации os.environ , If the platform supports the putenv() function, this mapping may be used to modify the environment as well as query the environment. putenv() will be called automatically when the mapping is modified. это отвечает на ваш вопрос?

3. Вы могли бы узнать, создав дочерний процесс.

4. Однако обратите внимание, что Popen и друзьям может быть передано пользовательское отображение env (это ключевое слово arg), т. Е. Только потому, что python породил подпроцесс, не означает, что он должен наследовать родительский env.

Ответ №1:

Окружающая среда — это концепция, связанная с процессом. Когда любая программа, независимо от того, является ли она сценарием оболочки, скриптом python, программой C и т. Д., Выполняет форк, Среда копируется. Поскольку os.environ при назначении переменной изменяется среда родительского процесса, да, дочерние процессы, созданные с помощью fork(), после этого получают измененную среду. Это эквивалентно export NAME=VALUE в оболочке.

Комментарии:

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

2. @JohnBollinger Спасибо, я расширил свой ответ, чтобы выразить это более четко.