为什么Python不能看到环境变量?

Ric*_*ard 16 python bash environment-variables

我正在使用Python 2研究Debian Jessie.为什么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'
Run Code Online (Sandbox Code Playgroud)

我使用/etc/environment- 设置这些环境变量- 不确定是否相关:

SECRET_KEY=xxx-xxx-xxx
Run Code Online (Sandbox Code Playgroud)

我不得不跑去source /etc/environment看看他们,我觉得这很奇怪.

更新:printenv SECRET_KEY什么都不产生,所以我猜SECRET_KEY是shell不是环境变量.

Mar*_*ers 35

您需要导出子进程的环境变量才能看到它们:

export SECRET_KEY
Run Code Online (Sandbox Code Playgroud)

演示:

$ 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
Run Code Online (Sandbox Code Playgroud)

您可以一步组合设置和导出:

export SECRET_KEY=xxx-xxx-xxxx
Run Code Online (Sandbox Code Playgroud)

请注意,新的变量/etc/environment不会自动显示在现有的shell中,直到您有新的登录名.对于GUI桌面,您必须注销并再次登录,对于SSH会话,您必须创建新的SSH登录.只有这样,您才能获得具有更改的新流程树.source /etc/environment仅使用设置"本地"变量(文件不是脚本).请参阅如何在不重新启动的情况下重新加载/ etc/environment?超级用户.

  • 值得注意的是,“os.environ”仅在第一次导入“os”模块时加载。因此,如果您调用“子进程”来执行 bash 脚本,当它返回到 python 脚本时,它将无法看到 bash 脚本中可能导出的新环境变量。 (2认同)