web-dev-qa-db-fra.com

python - os.getenv et os.environ ne voient pas les variables d'environnement de mon shell bash

Je suis sur Ubuntu 13.04, bash, python2.7.4

L'interpréteur ne voit pas les variables que j'ai définies.

Voici un exemple:

$ echo $A
5
$ python -c 'import os; print os.getenv( "A" )'
None
$ python -c 'import os; print os.environ[ "A" ]'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python2.7/UserDict.py", line 23, in __getitem__
    raise KeyError(key)
KeyError: 'A'

Mais tout fonctionne bien avec la variable PATH:

$ echo $PATH 
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ python -c 'import os; print os.getenv("PATH")'
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Et il remarque des changements dans PATH:

$ PATH="/home/alex/tests/:$PATH"
$ echo $PATH 
/home/alex/tests/:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ python -c 'import os; print os.getenv("PATH")'
/home/alex/tests/:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Qu'est-ce qui ne va pas?

PS le problème survient lors de l'utilisation de $PYTHONPATH:

$ python -c 'import os; print os.getenv("PYTHONPATH")'
None
33
xealits

Aha! la solution est simple!

Je définissais des variables avec _ $ A=5 commande; lorsque vous utilisez $ export B="kkk" tout va bien.

C'est-à-dire becaseexport met la variable à la disposition des sous-processus:

  • il crée une variable dans le Shell
  • et exporte dans le environment du Shell
  • la liste environment est passée aux sous-processus du Shell.

Plaine $ A="kkk" crée simplement des variables dans le Shell et ne fait rien avec le environment.

L'interpréteur appelé depuis le Shell obtient son environment du parent - le Shell. La variable doit donc être exportée dans le environment avant.

77
xealits

Ces variables (paramètres dans la terminologie bash) ne sont pas des variables d'environnement . Vous souhaitez les exporter dans l'environnement, en utilisant export ou declare -x. Voir documentation bash sur l'environnement .

6
Yann Vernier