2013-09-28 36 views
24

我在Ubuntu 13.04,慶典,python2.7.4蟒蛇 - os.getenv和os.environ沒有看到我的bash shell的

的解釋並沒有看到我的變量設置環境變量。

下面是一個例子:

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

但一切工作正常與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 

而且它在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 

可能是什麼錯誤?使用$PYTHONPATH

PS問題就來了:

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

回答

56

啊哈!解決方案很簡單!

我是用普通的$ A=5命令設置變量;當你使用$ export B="kkk"一切都很好。

也就是說becauseexport使得提供給子過程的變量:

  • 它在外殼
  • 出口它創建一個變量到外殼的environment
  • 列表將environment傳遞給shell的子進程。

Plain $ A="kkk"只是在shell中創建變量,並且不對environment做任何事情。

從shell調用的解釋器從父 - 殼獲得它的environment。所以真的變量應該導出到environment之前。

+0

Thx,救了我一些頭斑=) – Justin

4

這些變量(bash術語中的參數)不是環境變量。您想使用exportdeclare -x將它們導出到環境中。請參閱bash documentation on environment

+0

嘿!術語含糊不清:http://docs.python.org/2/using/cmdline.html#environment-variables – xealits

+0

不確定你在抱怨哪個術語,但問題在於bash。 Python無法控制bash在環境中放置哪些變量。 –

+0

我的意思是,如果它是一個「參數」或「變量」 - 對我無關緊要。我關心設置'PYTHONPATH'工作。雖然,我明白你的觀點 - 你的意思是賦值'$ A = 5'根本不會產生環境變量。在shell中有一個變量列表,稱爲「環境」。它被傳遞給子流程。 'export'聲明該列表中的一些變量(將它們導出)。普通賦值不會在該列表中創建變量 - 它將它們放在其他地方。根據所有這些我會糾正我的答案。 – xealits