Python: переменные среды не обновляются - PullRequest
1 голос
/ 22 февраля 2020

Я пытаюсь перезаписать переменные окружения в Python. Я могу прочитать значение, а затем записать значение и распечатать обновленное значение. Но потом, если я проверю значение в командной строке, оно все равно будет исходным значением. Почему это так?

Сначала я создаю переменную

export MYVAR=old_val

Мой тестовый скрипт myvar.py

#!/usr/bin/env python3
import os
print (os.environ['MYVAR'])
os.environ['MYVAR'] = "new_val"
print (os.environ['MYVAR'])

Выходы

$ ./myvar.py 
old_val
new_val
$ echo $MYVAR
old_val

Как видите, последняя строка вывода по-прежнему показывает old_val

Ответы [ 2 ]

5 голосов
/ 22 февраля 2020

Короткая версия:

Сценарий python меняет свою среду. Однако это не влияет на среду родительского процесса (оболочка)

Длинная версия:

Что ж, это хорошо известная, но довольно запутанная проблема.

Что вам нужно знать, так это то, что среда не существует, каждый процесс имеет свою собственную среду.

Итак, в вашем примере над оболочкой (где вы вводите свой код ) имеет одну среду. Когда вы вызываете ./myvar.py, создается копия текущей среды, которая передается вашему сценарию python. Ваш код «только» изменяет эту копию среды. Как только сценарий python будет завершен, эта копия будет уничтожена, и оболочка увидит свою исходную неизмененную среду.

Это верно для большинства операционных систем (Windows, Linux, MS-DOS, ...)

Другими словами: ни один дочерний процесс не может изменить среду вызывающего его процесса.

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

Однако, если ваш сценарий python запускает другой процесс (например, /bin/bash), тогда дочерний процесс увидит измененную среду.

2 голосов
/ 22 февраля 2020

Вы запустили новый процесс, который изменил его среду и вышел. Это все на самом деле.

Вы не должны ожидать, что это повлияет на процесс, с которого вы его запустили (ваша оболочка).

...