python - os.getenv 和 os.environ 看不到我的 bash shell 的环境变量

问题描述 投票:0回答:4

我使用的是 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
4个回答
115
投票

啊哈!解决办法很简单!

我使用普通的

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

也就是说 because

export
使变量可用于子流程:

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

Plain

$ A="foo"
只是在 shell 中创建变量,并且不对环境执行任何操作。

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


9
投票

这些变量(bash 术语中的参数)不是 环境 变量。您想使用

export
declare -x
将它们导出到环境中。请参阅有关环境的bash 文档


0
投票

添加,因为我没有看到与我遇到的问题完全相同的答案。如果您有多个“shell”,例如 BASH 和 Z-Shell,请确保您已在正确的 shell 中导出环境,并且该环境可供 python 使用。

如果您使用 VSCode 并将默认 shell 设置为 Z shell,那么可以理解的是,如果

.bashrc
中不存在变量,则
.zshrc
中的变量将不会对 python 解释器可见。那么解决方案是
export
两个 shell 中的变量,或者将默认 shell 更改为具有必要变量的 shell。


0
投票

正如 @NelsonGon 指出的,如果您在 shell 窗口 A 中设置环境变量,然后从 shell 窗口 B 启动 Python,则可能会出现此问题,因为窗口 B 对窗口 A 的环境一无所知。

这篇 Reddit 帖子中概述的一个解决方案是使用名为 python-dotenv

 的 Python 库将一个小环境文件加载到您正在使用的 Python 环境中。

引用他们的回答:

安装 python-dotenv

pip install python-dotenv
在项目目录中创建一个名为 

.env

 的文件

像这样添加秘密:

MY_SECRET_KEY =“12345”

SOME_OTHER_SECRET="45678"

然后在你的Python代码中,你可以编写以下内容,它就会工作。

from dotenv import load_dotenv import os load_dotenv() # you can specify a location to your .env file as an argument if it's not at your project root SECRET_KEY = os.getenv('MY_SECRET_KEY')
    
© www.soinside.com 2019 - 2024. All rights reserved.