답변:
한 가지 차이점이 관찰되었습니다 (Python27).
os.environ
환경 변수가 존재하지 않으면 예외가 발생합니다.
os.getenv
예외를 일으키지 않지만 None을 반환합니다.
os.environ.get()
vs 에 대해 묻지os.getenv()
만 신체 에도 vs가 포함되어 os.environ
있으므로이 os.environ.get()
답변은 적어도 일부 방법으로는 정확하지 않습니다.
이 관련 스레드를 참조하십시오 . 기본적으로 os.environ
가져 오기에서 발견 되며 적어도 CPython에서 os.getenv
래퍼 os.environ.get
입니다.
편집 : CPython에서 주석에 응답하는 os.getenv
것은 기본적으로 os.environ.get
; 이후로는 os.environ
수입에로드 os
, 만 다음, 동일을 위해 보유
os.getenv
.
os.getenv()
[...] 를 사용하는 주요 이유 는 환경 변수 이름이 os.environ
의 키에서 KeyError
또는 무엇이든 던지지 않고 찾을 수 없을 때 기본값을 반환하려는 경우입니다. 문자 몇 개를 저장하고 싶습니다. "
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
.
os.environ.get
와 사이에는 기능적 차이가 없지만 항목과 설정 사이 os.getenv
에는 큰 차이가 있습니다. 는 깨져서 대칭 에 사용하도록 권장 하는 방법을 피하기 위해 기본값으로 설정해야합니다 .os.putenv
os.environ
os.putenv
os.environ.get
os.getenv
os.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
/ 시작 구성을 피하기 위해해야 할 일 이 매우 조심 스럽다면 쉘 하위 프로세스를 시작하고 환경 변수를 요청하는 것도 효과가있을 수 있지만 제대로 이해하기가 훨씬 어려워 보입니다.
위의 답변 외에도
$ 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
os.getenv
에 대한 래퍼 일 뿐이 os.environ.get
므로 매우 적은 오버 헤드가 발생합니다.
usec
는 마이크로 초 입니다 timeit
. 이 마이크로 벤치마킹에서 발견 된 차이는 0.18 마이크로 초였습니다 ...
os.environ.get()
반환 값을 묻고None
env 인 경우 예외를 발생시키지 않습니다. var. 존재하지 않습니다. 사용os.environ['TERM']
하는 것과 혼동 되는 것은 질문에 관한 것이 아닙니다.