Подтвердить что ты не робот

Когда os.environ ['foo'] не соответствует os.getenv('foo')?

У меня есть небольшое приложение Python, запущенное через subprocess.Popen, которое принимает некоторые параметры в виде переменных среды. Я делаю это, передавая структуру среды в вызов Popen. Затем программа считывает переменные через os.getenv.

Или, скорее, он читал их таким образом. В Windows это работало нормально. Но на наших серверах FreeBSD os.getenv возвращает None для всех параметров, которые мы передали. Нечетная часть состоит в том, что os.environ имеет значения просто fine &mdash и, действительно, просто переключает все вызовы os.getenv('foo') на os.environ['foo'] заставило все работать отлично на обеих платформах.

Почему эти значения разные? Когда один соответствует другому?

4b9b3361

Ответ 1

os.environ создается при импорте модуля os и не отражает изменений в среде, которые происходят после этого, если они не изменены напрямую. Интересно, однако, что os.getenv() фактически не получает самые последние переменные среды, по крайней мере, не в CPython. Видите ли, в CPython os.getenv(), по-видимому, просто обертка вокруг os.environ.get() (см. http://hg.python.org/cpython/file/6671c5039e15/Lib/os.py#l646). Поэтому основная причина использования os.getenv() с указанной реализацией - это когда вы хотите вернуть значение по умолчанию, если имя переменной среды не найдено в os.environ, а не KeyError или что-то другое, и вы хотите сохранить несколько символов.

Вполне возможно, что реализация на FreeBSD имеет какой-то странный трюк, который заставляет его действовать по-другому, но я не уверен, почему это так. Посмотрите на копию os.py на одной из машин FreeBSD, которые вы используете, если сможете.