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을 반환합니다.


119
OP는 다르게 지정하지 않는 한 os.environ.get()반환 값을 묻고 Noneenv 인 경우 예외를 발생시키지 않습니다. var. 존재하지 않습니다. 사용 os.environ['TERM']하는 것과 혼동 되는 것은 질문에 관한 것이 아닙니다.
Anthon

2
OP의 질문os.environ.get()vs 에 대해 묻지os.getenv()신체 에도 vs가 포함되어 os.environ있으므로이 os.environ.get()답변은 적어도 일부 방법으로는 정확하지 않습니다.
FKEinternet

3
이 부정확하고 오해의 소지가있는 답변은 부정적인 하락 투표를 받았습니다. 다음은 정답입니다.
RayLuo

80

이 관련 스레드를 참조하십시오 . 기본적으로 os.environ가져 오기에서 발견 되며 적어도 CPython에서 os.getenv래퍼 os.environ.get입니다.

편집 : 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또는 무엇이든 던지지 않고 찾을 수 없을 때 기본값을 반환하려는 경우입니다. 문자 몇 개를 저장하고 싶습니다. "
mindthief

35

iPython이 포함 된 Python 2.7에서 :

>>> 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.putenvos.environos.putenvos.environ.getos.getenvos.putenv

os.putenv실제 OS 수준의 환경 변수를 변경하지만 방법으로 그 통해 표시되지 않습니다 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')

getenv을 호출 한 후 실제 환경 변수를 보려면 C 레벨 을 ctypes 호출해야 할 것입니다 os.putenv. 이스케이프 및 --norc/ --noprofile/ 시작 구성을 피하기 위해해야 ​​할 일 이 매우 조심 스럽다면 쉘 하위 프로세스를 시작하고 환경 변수를 요청하는 것도 효과가있을 수 있지만 제대로 이해하기가 훨씬 어려워 보입니다.


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므로 매우 적은 오버 헤드가 발생합니다.
Preslav Rachev

macOS Mojave에서는 3.7.1이었습니다. 타이밍은 꽤 일관되었습니다.
fredrik

@PreslavRachev는 최소한인지 여부에 관계없이 추가 함수 호출이므로 약간의 오버 헤드가 있습니다. 즉, 내부 루프 중간에 env 변수를 검색 할 필요가 없습니다.
pmav99

7
전혀 관련이 없습니다. 단일 함수 호출의 미세 최적화 ... 모든 응용 프로그램은 어쨌든 부트 스트랩에서만 환경을 읽어야하며, 이는 더욱 중요합니다.
Victor Schröder

1
BTW usec마이크로 초 입니다 timeit. 이 마이크로 벤치마킹에서 발견 된 차이는 0.18 마이크로 초였습니다 ...
Victor Schröder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.