Czy jest jakaś różnica między oboma podejściami?
>>> 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
Wydaje się, że mają dokładnie taką samą funkcjonalność.
python
environment-variables
python-os
André Staltz
źródło
źródło
os.environ.get()
który zwracaNone
(chyba że określono inaczej) i nigdy nie zgłasza wyjątku, jeśli parametr env. var. nie istnieje. Twoje mylące rzeczy z używaniem, oos.environ['TERM']
co nie chodzi w pytaniu.os.environ.get()
vs,os.getenv()
ale treść zawiera równieżos.environ
vs.,os.environ.get()
więc ta odpowiedź jest poprawna przynajmniej w pewnym sensie - niekompletna, ale poprawna.Zobacz ten powiązany wątek . Zasadniczo
os.environ
znajduje się podczas importu ios.getenv
jest opakowaniemos.environ.get
, przynajmniej w CPythonie.EDYCJA: odpowiadanie na komentarz w CPythonie
os.getenv
jest w zasadzie skrótem doos.environ.get
; ponieważos.environ
jest ładowany przy imporcieos
i tylko wtedy, to samo dotyczyos.getenv
.źródło
os.getenv()
[...] jest sytuacja, gdy chcesz, aby wartość domyślna była zwracana, gdy nazwa zmiennej środowiskowej nie została znaleziona wos.environ
kluczach, a nie zostałaKeyError
wyrzucona a lub cokolwiek innego, a ty chcesz zaoszczędzić kilka znaków. "W Pythonie 2.7 z iPythonem:
Możemy więc wnioskować, że
os.getenv
jest to po prostu zwykłe opakowanieos.environ.get
.źródło
Chociaż nie ma funkcjonalnej różnicy między
os.environ.get
ios.getenv
, istnieje ogromna różnica międzyos.putenv
wpisami i ustawieniamios.environ
.os.putenv
jest uszkodzony , więc powinieneś domyślnieos.environ.get
po prostu unikać sposobu, w jakios.getenv
zachęca cię do używaniaos.putenv
symetrii.os.putenv
zmienia rzeczywistych zmiennych środowiskowych OS-poziom, ale w taki sposób, że nie pojawi się przezos.getenv
,os.environ
lub w inny sposób stdlib z kontroli zmiennych środowiskowych:Prawdopodobnie musiałbyś wykonać wywołanie ctypes do poziomu C,
getenv
aby zobaczyć rzeczywiste zmienne środowiskowe po wywołaniuos.putenv
. (Uruchomienie podprocesu powłoki i poproszenie go o jego zmienne środowiskowe może również zadziałać, jeśli jesteś bardzo ostrożny przy ucieczce i--norc
/--noprofile
/ cokolwiek innego, co musisz zrobić, aby uniknąć konfiguracji startowej, ale wydaje się, że jest to dużo trudniejsze.)źródło
Oprócz powyższych odpowiedzi:
źródło
os.getenv
jest tylko opakowaniemos.environ.get
, więc otrzymuję bardzo minimalne obciążenie.usec
to mikrosekunda wtimeit
. Różnica znaleziona w tym mikro-benchmarkingu wyniosła 0,18 mikrosekundy ...