为什么 Python 看不到环境变量?
Why can't Python see environment variables?
我正在使用 Python 开发 Debian Jessie 2. 为什么 Python 的 environ
看不到 bash 中可见的环境变量?
# echo $SECRET_KEY
xxx-xxx-xxxx
# python
>>> from os import environ
>>> environ["SECRET_KEY"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/root/.virtualenvs/prescribing/lib/python2.7/UserDict.py", line 23, in __getitem__
raise KeyError(key)
KeyError: 'SECRET_KEY'
我使用 /etc/environment
设置了这些环境变量 - 不确定这是否相关:
SECRET_KEY=xxx-xxx-xxx
我不得不 运行 source /etc/environment
才能 bash 看到它们,我觉得这很奇怪。
更新:printenv SECRET_KEY
什么都不产生,所以我猜 SECRET_KEY
是一个 shell 而不是环境变量。
您需要导出 子进程才能看到的环境变量:
export SECRET_KEY
演示:
$ SECRET_KEY='foobar'
$ bin/python -c "import os; print os.environ.get('SECRET_KEY', 'Nonesuch')"
Nonesuch
$ export SECRET_KEY
$ bin/python -c "import os; print os.environ.get('SECRET_KEY', 'Nonesuch')"
foobar
您可以一步将设置和导出结合起来:
export SECRET_KEY=xxx-xxx-xxxx
请注意,/etc/environment
中的新变量不会自动显示在您现有的 shell 中,除非您有 新登录名 。对于 GUI 桌面,您必须注销并重新登录,对于 SSH 会话,您必须创建一个新的 SSH 登录。只有这样,您才能获得包含当前更改的新流程树。使用 source /etc/environment
仅设置 'local' 变量(该文件不是脚本)。请参阅超级用户 How to reload /etc/environment without rebooting?。
我正在使用 Python 开发 Debian Jessie 2. 为什么 Python 的 environ
看不到 bash 中可见的环境变量?
# echo $SECRET_KEY
xxx-xxx-xxxx
# python
>>> from os import environ
>>> environ["SECRET_KEY"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/root/.virtualenvs/prescribing/lib/python2.7/UserDict.py", line 23, in __getitem__
raise KeyError(key)
KeyError: 'SECRET_KEY'
我使用 /etc/environment
设置了这些环境变量 - 不确定这是否相关:
SECRET_KEY=xxx-xxx-xxx
我不得不 运行 source /etc/environment
才能 bash 看到它们,我觉得这很奇怪。
更新:printenv SECRET_KEY
什么都不产生,所以我猜 SECRET_KEY
是一个 shell 而不是环境变量。
您需要导出 子进程才能看到的环境变量:
export SECRET_KEY
演示:
$ SECRET_KEY='foobar'
$ bin/python -c "import os; print os.environ.get('SECRET_KEY', 'Nonesuch')"
Nonesuch
$ export SECRET_KEY
$ bin/python -c "import os; print os.environ.get('SECRET_KEY', 'Nonesuch')"
foobar
您可以一步将设置和导出结合起来:
export SECRET_KEY=xxx-xxx-xxxx
请注意,/etc/environment
中的新变量不会自动显示在您现有的 shell 中,除非您有 新登录名 。对于 GUI 桌面,您必须注销并重新登录,对于 SSH 会话,您必须创建一个新的 SSH 登录。只有这样,您才能获得包含当前更改的新流程树。使用 source /etc/environment
仅设置 'local' 变量(该文件不是脚本)。请参阅超级用户 How to reload /etc/environment without rebooting?。