【发布时间】:2016-09-01 20:33:48
【问题描述】:
我正在使用os.environ.get 访问脚本中的环境变量,它抛出了KeyError。它不会从 Python 提示符抛出错误。这是在 OS X 10.11.6 上运行的,并且是 Python 2.7.10。
发生了什么事?
$ python score.py
Traceback (most recent call last):
File "score.py", line 4, in <module>
setup_logging()
File "/score/log.py", line 29, in setup_logging
config = get_config()
File "/score/log.py", line 11, in get_config
environment = os.environ.get('NODE_ENV')
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/UserDict.py", line 23, in __getitem__
raise KeyError(key)
KeyError: 'NODE_ENV'
$ python -c "import os; os.environ.get('NODE_ENV')"
$
根据要求,这是score.py的源代码
from __future__ import print_function
from log import get_logger, setup_logging
setup_logging()
log = get_logger('score')
这里是log.py
import json
import os
import sys
from iron_worker import IronWorker
from logbook import Logger, Processor, NestedSetup, StderrHandler, SyslogHandler
IRON_IO_TASK_ID = IronWorker.task_id()
def get_config():
environment = os.environ.get('NODE_ENV')
if environment == 'production':
filename = '../config/config-production.json'
elif environment == 'integration':
filename = '../config/config-integration.json'
else:
filename = '../config/config-dev.json'
with open(filename) as f:
return json.load(f)
def setup_logging():
# This defines a remote Syslog handler
# This will include the TASK ID, if defined
app_name = 'scoreworker'
if IRON_IO_TASK_ID:
app_name += '-' + IRON_IO_TASK_ID
config = get_config()
default_log_handler = NestedSetup([
StderrHandler(),
SyslogHandler(
app_name,
address = (config['host'], config['port']),
level = 'ERROR',
bubble = True
)
])
default_log_handler.push_application()
def get_logger(name):
return Logger(name)
【问题讨论】:
-
你能提供
score.py的代码吗? -
无法复制...
-
这很奇怪。
get永远不应该抛出KeyError;如果找不到密钥(或者如果您提供了任何默认值),它应该返回None。哎呀,该方法的 source code 根本不应该有raise KeyError(key)行! -
您会遇到这种情况吗:stackoverflow.com/a/26906934/3642398?我不知道这可能会发生(堆栈跟踪显示当前代码,但从
.pyc文件执行代码),但似乎是该用户所描述的。 -
@Two-BitAlchemist -- 是的,这也是我的本地 python 安装(2.7.10)上的样子。但奇怪的是
UserDict.get(UserDict.py 中的第 61 行)应该在回溯中——但我没有看到它。这几乎就像有人修补了UserDict.get = UserDict.__getitem__的猴子,但这将是一件非常阴暗的事情......
标签: python python-2.7