54

I am on ubuntu 13.04, bash, python2.7.4

The interpreter doesn't see variables I set.

Here is an example:

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

But everything works fine with the PATH variable:

$ 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

And it notices changes in 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

What could be wrong?

PS the problem comes when using $PYTHONPATH:

$ python -c 'import os; print os.getenv("PYTHONPATH")'
None
xealits
  • 3,754
  • 2
  • 25
  • 33

2 Answers2

98

Aha! the solution is simple!

I was setting variables with plain $ A=5 command; when you use $ export B="foo" everything is fine.

That is because export makes the variable available to sub-processes:

  • it creates a variable in the shell
  • and exports it into the environment of the shell
  • the environment is passed to sub-processes of the shell.

Plain $ A="foo" just creates variables in the shell and doesn't do anything with the environment.

The interpreter called from the shell obtains its environment from the parent -- the shell. So really the variable should be exported into the environment before.

Charles Duffy
  • 257,635
  • 38
  • 339
  • 400
xealits
  • 3,754
  • 2
  • 25
  • 33
9

Those variables (parameters in bash terminology) are not environment variables. You want to export them into the environment, using export or declare -x. See the bash documentation on environment.

Yann Vernier
  • 14,850
  • 2
  • 25
  • 26
  • hey! terminology is vague: http://docs.python.org/2/using/cmdline.html#environment-variables – xealits Sep 28 '13 at 19:18
  • Not sure which term you're complaining about, but the issue lies with bash. Python has no control over which variables bash puts in the environment. – Yann Vernier Sep 28 '13 at 19:21
  • I mean that if it is a "parameter" or "variable" -- doesn't matter to me. I care about setting `PYTHONPATH` to work. Though, I see your point -- you mean that assignment `$ A=5` doesn't make an environment variable at all. There is a list of variables in the shell, called "environment". It is passed to sub-processes. And `export` declares some variables in that list (exports them into it). Plain assignment doesn't create variables in that list -- it puts them somewhere else. I'll correct my answer according to all of this. – xealits Sep 28 '13 at 19:32