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