Differenza tra os.getenv e os.environ.get


159

C'è qualche differenza tra entrambi gli approcci?

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

Sembrano avere la stessa identica funzionalità.

Risposte:


60

Una differenza osservata (Python27):

os.environsolleva un'eccezione se la variabile ambientale non esiste. os.getenvnon genera un'eccezione, ma restituisce None


119
L'OP chiede os.environ.get()quali ritorni None(se non diversamente specificato) e non solleva mai un'eccezione se env. var. non esiste. Le tue cose confuse con l'uso di os.environ['TERM']cui non si tratta la domanda.
Anthon,

2
La domanda del PO fa domande sul os.environ.get()vs os.getenv()ma il corpo include anche il os.environvs, os.environ.get()quindi questa risposta è corretta in almeno alcuni modi: incompleta, ma corretta.
FK Internet dal

3
Questa risposta errata e fuorviante avrebbe dovuto ricevere voti negativi. La prossima risposta è quella giusta.
RayLuo,

80

Vedi questo thread correlato . Fondamentalmente, os.environsi trova all'importazione ed os.getenvè un wrapper os.environ.get, almeno in CPython.

EDIT: rispondere a un commento, in CPython, os.getenvè fondamentalmente una scorciatoia per os.environ.get; poiché os.environviene caricato all'importazione di os, e solo allora, lo stesso vale per os.getenv.


1
In effetti, secondo il documento ufficiale: docs.python.org/3/library/os.html
ivanleoncz,

1
Dal thread collegato collegato: "il motivo principale per utilizzare os.getenv()[...] è quando si desidera che venga restituito un valore predefinito quando un nome di variabile di ambiente non viene trovato nelle os.environchiavi piuttosto che avere un KeyErroro qualunque oggetto, e tu voglio salvare alcuni personaggi ".
mindthief

35

In Python 2.7 con 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

Quindi possiamo concludere che os.getenvè solo un semplice wrapper in giro os.environ.get.


16

Sebbene non vi sia alcuna differenza funzionale tra os.environ.gete os.getenv, esiste una differenza enorme tra os.putenve impostazione delle voci os.environ. os.putenvè rotto , quindi dovresti os.environ.getsemplicemente evitare che il modo os.getenvti incoraggi a usare os.putenvper la simmetria.

os.putenvcambia le variabili di ambiente reale a livello di sistema operativo, ma in un modo che non mostra attraverso os.getenv, os.environo qualsiasi altro modo stdlib di ispezionare variabili d'ambiente:

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

Probabilmente dovresti effettuare una chiamata di tipo C al livello C getenvper vedere le variabili di ambiente reali dopo aver chiamato os.putenv. (Anche l'avvio di un sottoprocesso della shell e la sua richiesta per le sue variabili di ambiente potrebbe funzionare, se stai molto attento all'evasione e --norc/ --noprofile/ a qualsiasi altra cosa che devi fare per evitare la configurazione di avvio, ma sembra molto più difficile farlo bene.)


2

Oltre alle risposte sopra:

$ 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

Con quale versione di Python hai provato. Su 3.7.2, os.getenvè solo un wrapper per os.environ.get, quindi sto ricevendo un sovraccarico minimo.
Preslav Rachev,

Quello era 3.7.1 su macOS Mojave. I tempi erano piuttosto coerenti.
Fredrik,

@PreslavRachev minimal o no è una chiamata di funzione extra, quindi c'è un sovraccarico. Detto questo, probabilmente non hai bisogno di recuperare variabili env nel mezzo del tuo ciclo interno.
pmav99,

7
Totalmente irrilevante. Micro-ottimizzazione di una chiamata a singola funzione ... Qualsiasi applicazione dovrebbe comunque leggere l'ambiente solo sul bootstrap, rendendolo ancora più irrilevante.
Victor Schröder,

1
A proposito, usecè un microsecondo in timeit. La differenza riscontrata in questo micro-benchmarking era di 0,18 microsecondi ...
Victor Schröder,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.