it-roy-ru.com

Разница между os.getenv и os.environ.get

Есть ли разница между обоими подходами?

>>> os.getenv('TERM')
'xterm'
>>> os.environ.get('TERM')
'xterm'

>>> os.getenv('FOOBAR', "not found") == "not found"
True
>>> os.environ.get('FOOBAR', "not found") == "not found"
True

Кажется, они имеют одинаковую функциональность.

110
André Staltz

Наблюдается одно различие (Python27):

os.environ вызывает исключение, если переменная окружения не существует. os.getenv не вызывает исключение, но возвращает None

38
giwyni

Смотрите это связанная ветка . По сути, os.environ находится при импорте, а os.getenv является оберткой для os.environ.get, по крайней мере, в CPython.

Правка: Чтобы ответить на комментарий, в CPython, os.getenv в основном ярлык для os.environ.get; поскольку os.environ загружается при импорте os, и только тогда то же самое сохраняется для os.getenv.

54
W. Conrad Walden

В Python 2.7 с iPython:

>>> import os
>>> os.getenv??
Signature: os.getenv(key, default=None)
Source:
def getenv(key, default=None):
    """Get an environment variable, return None if it doesn't exist.
    The optional second argument can specify an alternate default."""
    return environ.get(key, default)
File:      ~/venv/lib/python2.7/os.py
Type:      function

Таким образом, мы можем заключить, что os.getenv - это просто оболочка вокруг os.environ.get.

29
Zulu

В дополнение к ответам выше:

$ python3 -m timeit -s 'import os' 'os.environ.get("TERM_PROGRAM")'
200000 loops, best of 5: 1.65 usec per loop

$ python3 -m timeit -s 'import os' 'os.getenv("TERM_PROGRAM")'
200000 loops, best of 5: 1.83 usec per loop
3
fredrik

Хотя функциональных различий между os.environ.get и os.getenv нет, существует значительная разница между os.putenv и настройкой записей в os.environ. os.putenv имеет значение не работает, поэтому по умолчанию следует использовать os.environ.get, чтобы просто избежать того, как os.getenv рекомендует использовать os.putenv для симметрии.

os.putenv изменяет фактические переменные среды уровня ОС, но таким способом, который не отображается через os.getenv, os.environ или любой другой способ проверки переменных окружения в stdlib:

>>> import os
>>> os.environ['asdf'] = 'fdsa'
>>> os.environ['asdf']
'fdsa'
>>> os.putenv('aaaa', 'bbbb')
>>> os.getenv('aaaa')
>>> os.environ.get('aaaa')

Вам, вероятно, придется сделать вызов ctypes к уровню C getenv, чтобы увидеть реальные переменные среды после вызова os.putenv. (Запуск подпроцесса Shell и запрос его для переменных окружения также может сработать, если вы очень осторожны с экранированием и --norc/--noprofile/что-нибудь еще, что вам нужно сделать, чтобы избежать конфигурации при запуске, но кажется, что сделать это намного сложнее. )

2
user2357112