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

159

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

>>> 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

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

Андре Штальц
источник

Ответы:

60

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

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

giwyni
источник
119
ОП спрашивает о том, os.environ.get()какой возврат None(если не указано иное), и никогда не вызывает исключения, если env. вар. не существует Ваши запутанные вещи с использованием os.environ['TERM']которых не в чем вопрос.
Anthon
2
Ор в вопрос спрашивает о os.environ.get()против , os.getenv()но тело также включает в себя os.environvs. os.environ.get()так что этот ответ правильный , по крайней мере , в некоторых отношениях - неполное, но правильный.
FKEinternet
3
Этот неправильный и вводящий в заблуждение ответ должен был получить отрицательные отрицательные голоса. Следующий ответ правильный.
RayLuo
80

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

РЕДАКТИРОВАТЬ: ответить на комментарий, в CPython, os.getenvв основном ярлык os.environ.get; поскольку os.environзагружается при импорте os, и только тогда, то же самое верно для os.getenv.

В. Конрад Уолден
источник
1
Действительно, согласно официальному документу: docs.python.org/3/library/os.html
ivanleoncz,
1
Из связанного связанного потока: «главная причина использования os.getenv()[...] - это когда вы хотите получить значение по умолчанию, возвращаемое, когда имя переменной среды не найдено в os.environключах, а не KeyErrorброшено или что-то еще, и вы хочу сохранить несколько символов. "
вор
35

В 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.

зулус
источник
16

Хотя функциональных различий между 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. (Запуск подпроцесса оболочки и запрос его переменных окружения также могут сработать, если вы очень осторожны с экранированием и --norc/ --noprofileили чем-то еще, что вам нужно сделать, чтобы избежать настройки при запуске, но кажется, что сделать это намного сложнее.)

user2357112 поддерживает Monica
источник
2

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

$ 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
Фредрик
источник
С какой версией Python вы тестировали. На 3.7.2 os.getenvэто просто оболочка для os.environ.get, поэтому я получаю очень минимальные накладные расходы.
Преслав Рачев
Это было 3.7.1 на MacOS Mojave. Время было довольно последовательным.
Фредрик
@PreslavRachev минимальный или нет, это дополнительный вызов функции, поэтому есть некоторые накладные расходы. При этом вам, вероятно, не нужно извлекать переменные env в середине вашего внутреннего цикла.
pmav99
7
Совершенно не имеет значения. Микрооптимизация одного вызова функции ... Любое приложение в любом случае должно читать среду только при начальной загрузке, что делает это еще более неактуальным.
Виктор Шредер
1
Кстати, usecэто микросекунда в timeit. Разница, обнаруженная в этом микро-бенчмаркинге, составила 0,18 микросекунд ...
Виктор Шредер,