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

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

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

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

  • Как установить Python 2.x и Python 3.x в Windows 7
  • GetWindowRect слишком мал для Windows 7
  • Как найти реальный домашний каталог пользователя с помощью python?
  • Как напечатать строку юникода в python в консоли Windows
  • Почему я не могу обработать KeyboardInterrupt в python?
  • Как переключиться между python 2.7 на python 3 из командной строки?
  • Добавление пути Python в Windows 7
  • paralellizing svn up, вызывающий замораживание клиента
  • One Solution collect form web for “Когда os.environ не соответствует os.getenv ('foo')?”

    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 или что-то KeyError брошен, и вы хотите сохранить несколько символов.

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

    Python - лучший язык программирования в мире.