Qual è una buona pratica per verificare se esiste o meno una variabile ambientale?


130

Voglio controllare il mio ambiente per l'esistenza di una variabile, diciamo "FOO", in Python. A tale scopo, sto usando la oslibreria standard. Dopo aver letto la documentazione della biblioteca, ho capito 2 modi per raggiungere il mio obiettivo:

Metodo 1:

if "FOO" in os.environ:
    pass

Metodo 2:

if os.getenv("FOO") is not None:
    pass

Vorrei sapere quale metodo, se entrambi, è un buono / preferito condizionato e perché.


Si basa principalmente sull'opinione pubblica. Entrambi hanno lo stesso scopo. Preferirò il metodo 1 perché è più pulito
Moinuddin Quadri

1
Non posso dire che ci sia qualcosa dentro. Scegline uno (lancia una moneta?) E rivaluta più tardi se si scopre che non funziona. Francamente penso che tu abbia speso più tempo a scrivere questa domanda di quanto avresti risparmiato in entrambi i modi!
jonrsharpe,

1
@Ayoub: Penso che ti sia dimenticato di vedere la domanda "Qual è una buona pratica per verificare se esiste una variabile ambientale in Python o no?"
Moinuddin Quadri

1
Basato sull'opinione. La sintassi del metodo 1 serve meglio, poiché chiedi se fooè presente nelle aree, non se cerchi foorisultati in Nonevalori.
Uriel,

1
Ma in questo modo potrebbe non essere ovvio, a meno che tu non sia olandese ...
jonrsharpe,

Risposte:


168

Usa il primo; cerca direttamente di verificare se qualcosa è definito in environ. Sebbene la seconda forma funzioni ugualmente bene, manca semanticamente poiché ottieni un valore se esiste e lo usi solo per un confronto.

Stai cercando di vedere se qualcosa è presente in environ , il motivo per cui si dovrebbe ottenere solo per confrontare e poi buttare via ?

Questo è esattamente ciò che getenvfa:

Ottieni una variabile d'ambiente , ritorna Nonese non esiste. Il secondo argomento facoltativo può specificare un valore predefinito alternativo.

(questo significa anche che il tuo assegno potrebbe essere if getenv("FOO"))

non vuoi prenderlo , vuoi verificarne l'esistenza.

In entrambi i casi, getenvè solo un wrapper environ.getma non vedi persone che controllano l'appartenenza ai mapping con:

from os import environ
if environ.get('Foo') is not None:

Per riassumere, utilizzare:

if "FOO" in os.environ:
    pass

se vuoi solo verificare l'esistenza, mentre, getenv("FOO")se vuoi davvero fare qualcosa con il valore che potresti ottenere.


2
Grazie per la tua spiegazione. Lo terrò a mente.
Kshitij Saraogi,

29

Esiste un caso per entrambe le soluzioni, a seconda di ciò che si desidera fare in base all'esistenza della variabile di ambiente.

Caso 1

Quando si desidera intraprendere azioni diverse basandosi esclusivamente sull'esistenza della variabile d'ambiente, senza preoccuparsi del suo valore, la prima soluzione è la migliore pratica. Descrive in modo succinto ciò per cui si esegue il test: è "FOO" nell'elenco delle variabili di ambiente.

if 'KITTEN_ALLERGY' in os.environ:
    buy_puppy()
else:
    buy_kitten()

Caso 2

Quando si desidera impostare un valore predefinito se il valore non è definito nelle variabili di ambiente, la seconda soluzione è effettivamente utile, sebbene non nella forma in cui è stata scritta:

server = os.getenv('MY_CAT_STREAMS', 'youtube.com')

o forse

server = os.environ.get('MY_CAT_STREAMS', 'youtube.com')

Nota che se hai diverse opzioni per la tua applicazione potresti voler esaminare ChainMap, il che consente di unire più dicts in base alle chiavi. C'è un esempio di questo nella ChainMapdocumentazione:

[...]
combined = ChainMap(command_line_args, os.environ, defaults)

15

Essere al sicuro

os.getenv('FOO') or 'bar'

Un caso d'angolo con le risposte sopra è quando la variabile d'ambiente è impostata ma è vuota

Per questo caso speciale che ottieni

print(os.getenv('FOO', 'bar'))
# prints new line - though you expected `bar`

o

if "FOO" in os.environ:
    print("FOO is here")
# prints FOO is here - however its not

Per evitare questo basta usare or

os.getenv('FOO') or 'bar'

Quindi ottieni

print(os.getenv('FOO') or 'bar')
# bar

Quando abbiamo variabili d'ambiente vuote?

Hai dimenticato di impostare il valore nel .envfile

# .env
FOO=

o esportato come

$ export FOO=

o ho dimenticato di impostarlo settings.py

# settings.py
os.environ['FOO'] = ''

Aggiornamento: in caso di dubbi, dai un'occhiata a questi one-liner

>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))

$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"

La firma per getenv è def getenv(key, default=None):così se ciò dovrebbe consentire un default rispetto alla sintassi o all'inizio
Chris McKee,

@ Chris McKee prova questo>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))
Levon

Firma del metodo fuorviante 😜
Chris McKee,

1
@ Chris McKee, un altro esempio$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"
Levon,

3

Nel caso in cui si desideri verificare se non sono impostate più variabili env, è possibile effettuare le seguenti operazioni:

import os

MANDATORY_ENV_VARS = ["FOO", "BAR"]

for var in MANDATORY_ENV_VARS:
    if var not in os.environ:
        raise EnvironmentError("Failed because {} is not set.".format(var))

-1

Il mio commento potrebbe non essere pertinente ai tag forniti. Tuttavia, sono stato portato a questa pagina dalla mia ricerca. Stavo cercando un controllo simile in R e ho trovato il seguente con l'aiuto del post @hugovdbeg. Spero che sarebbe utile per qualcuno che sta cercando una soluzione simile in R

'USERNAME' %in% names(Sys.getenv())
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.