【问题标题】:python - os.getenv and os.environ don't see environment variables of my bash shellpython - os.getenv 和 os.environ 看不到我的 bash shell 的环境变量
【发布时间】:2013-10-04 22:09:04
【问题描述】:

我在 ubuntu 13.04,bash,python2.7.4

解释器看不到我设置的变量。

这是一个例子:

$ 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

可能出了什么问题?

PS 使用$PYTHONPATH时出现问题:

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

【问题讨论】:

    标签: python bash environment-variables pythonpath


    【解决方案1】:

    啊哈!解决方法很简单!

    我用普通的$ A=5 命令设置变量;当您使用$ export B="foo" 时,一切都很好。

    because export 使变量可用于子进程:

    • 它在 shell 中创建一个变量
    • 将其导出到shell的环境中
    • 环境被传递给 shell 的子进程。

    Plain $ A="foo" 只是在 shell 中创建变量,不对环境做任何事情。

    从 shell 调用的解释器从父 shell 获取其环境。所以真的应该先将变量导出到环境中。

    【讨论】:

    • environment 不是代码,所以不应该是代码格式的。
    【解决方案2】:

    那些变量(bash 术语中的参数)不是 环境 变量。您想使用exportdeclare -x 将它们导出到环境中。请参阅bash documentation on environment

    【讨论】:

    • 不确定您在抱怨哪个术语,但问题在于 bash。 Python 无法控制 bash 将哪些变量放入环境中。
    • 我的意思是,如果它是“参数”或“变量”——对我来说并不重要。我关心设置PYTHONPATH 工作。不过,我明白你的意思——你的意思是赋值 $ A=5 根本不会产生环境变量。 shell中有一个变量列表,称为“环境”。它被传递给子进程。并且export 在该列表中声明了一些变量(将它们导出到其中)。普通赋值不会在该列表中创建变量——它会将它们放在其他地方。我会根据所有这些来更正我的答案。
    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 2018-07-26
    • 2017-09-08
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    相关资源
    最近更新 更多