web-dev-qa-db-fra.com

Pourquoi ne peut pas Python voir les variables d'environnement?

Je travaille sur Debian Jessie avec Python 2. Pourquoi les environ de Python ne peuvent-ils pas voir les variables d'environnement qui sont visibles dans bash?

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

J'ai défini ces variables d'environnement en utilisant /etc/environment - je ne sais pas si c'est pertinent:

SECRET_KEY=xxx-xxx-xxx

Je devais courir source /etc/environment pour que Bash les voie, ce que j'ai trouvé étrange.

METTRE À JOUR: printenv SECRET_KEY ne produit rien, donc je suppose SECRET_KEY est un Shell et non une variable d'environnement.

21
Richard

Vous devez exporter les variables d'environnement pour que les processus enfants les voient:

export SECRET_KEY

Démo:

$ 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

Vous pouvez combiner le réglage et l'exportation en une seule étape:

export SECRET_KEY=xxx-xxx-xxxx

Notez que de nouvelles variables dans /etc/environment n'apparaissent pas automatiquement dans vos shells existants, tant que vous n'avez pas une nouvelle connexion . Pour un bureau GUI, vous devrez vous déconnecter et vous reconnecter, pour les sessions SSH, vous devrez créer une nouvelle connexion SSH. Ce n'est qu'alors que vous obtiendrez une nouvelle arborescence de processus avec les modifications présentes. En utilisant source /etc/environment ne définit que les variables "locales" (le fichier n'est pas un script). Voir Comment recharger/etc/environment sans redémarrer? sur Super User.

34
Martijn Pieters