2015-08-13 9 views
7

Sto lavorando su Debian Jessie con Python 2. Perché non è possibile vedere le variabili di ambiente di Python environ visibili in bash?Perché Python non può vedere le variabili d'ambiente?

# echo $SECRET_KEY 
xxx-xxx-xxxx 
# python 
>>> from os import environ 
>>> environ["SECRET_KEY"] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/root/.virtualenvs/prescribing/lib/python2.7/UserDict.py", line 23, in __getitem__ 
    raise KeyError(key) 
KeyError: 'SECRET_KEY' 

ho impostato queste variabili di ambiente utilizzando /etc/environment - non so se questo è rilevante:

SECRET_KEY=xxx-xxx-xxx 

ho dovuto correre per arrivare source /etc/environment bash a vederli, che mi è sembrato strano.

UPDATE: printenv SECRET_KEY non produce nulla, quindi suppongo che SECRET_KEY non sia una variabile di ambiente.

+1

Questa non è una variabile di ambiente; è solo una variabile di shell finché non la si esporta. –

+0

Davvero? Pensavo che '/ env/environment' fosse utile per impostare le variabili di ambiente - è sbagliato? – Richard

+0

L'uso di 'source/env/environment' imposta solo variabili nella shell, non variabili di ambiente accessibili dai processi figli. –

risposta

19

È necessario esportazione variabili di ambiente per i processi figli per vederli:

export SECRET_KEY 

Demo:

$ SECRET_KEY='foobar' 
$ bin/python -c "import os; print os.environ.get('SECRET_KEY', 'Nonesuch')" 
Nonesuch 
$ export SECRET_KEY 
$ bin/python -c "import os; print os.environ.get('SECRET_KEY', 'Nonesuch')" 
foobar 

È possibile combinare l'impostazione e l'esportazione in un solo passaggio:

export SECRET_KEY=xxx-xxx-xxxx 

Si noti che le nuove variabili in /etc/environment non vengono visualizzate automaticamente nelle shell esistenti, non finché non si dispone di un nuovo accesso . Per un desktop GUI, dovrai disconnetterti e accedere di nuovo, per le sessioni SSH dovrai creare un nuovo login SSH. Solo allora otterrai un nuovo albero di processi con le modifiche presenti. L'utilizzo di source /etc/environment imposta solo variabili "locali" (il file non è uno script). Vedi How to reload /etc/environment without rebooting? su Super User.

+0

Stavo cercando di seguire le istruzioni in https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fenvironment - dovrei usare 'export foo-bar' invece di' foo = bar' in/etc/environment ? – Richard

+0

Vale la pena notare che 'os.environ' viene caricato solo la prima volta che viene importato il modulo 'os'. Quindi, se si chiama un sottoprocesso per eseguire uno script bash, quando ritorna allo script python non sarà in grado di vedere le nuove variabili di ambiente che sono state eventualmente esportate nel proprio script bash. – amza

+1

@Richard: nella tua domanda l'hai chiamato '/ env/environment', non'/etc/environment' .. Non sono * che * abbia familiarità con Ubuntu, avrò uno sguardo su come il sistema operativo sta usando quelli. Hai ricominciato dopo aver apportato modifiche al file? –

Problemi correlati