GAE devappserver2 TypeError:不支持的操作数类型为 - :'datetime.datetime'和'NoneType'
问题描述:
我见过这个问题的许多迭代,以及许多非常具体和无用的ansers。现在的问题是这样的:GAE devappserver2 TypeError:不支持的操作数类型为 - :'datetime.datetime'和'NoneType'
当运行dev_appserver.py app.yaml
我得到一个错误,像这样:
waxed_backend_1 | _run_file(__file__, globals())
waxed_backend_1 | File "/google-cloud-sdk/platform/google_appengine/dev_appserver.py", line 97, in _run_file
waxed_backend_1 | execfile(_PATHS.script_file(script_name), globals_)
waxed_backend_1 | File "/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 899, in <module>
waxed_backend_1 | main()
waxed_backend_1 | File "/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 895, in main
waxed_backend_1 | dev_server.stop()
waxed_backend_1 | File "/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 775, in stop
waxed_backend_1 | metrics.GetMetricsLogger().Stop()
waxed_backend_1 | File "/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/metrics.py", line 123, in Stop
waxed_backend_1 | total_run_time = int((Now() - self._start_time).total_seconds())
waxed_backend_1 | TypeError: unsupported operand type(s) for -: 'datetime.datetime' and 'NoneType'
一个人怎么调试呢?
答
在里面提到的错误的metrics.py脚本,你会看到这样的内容:
class _MetricsLogger(object):
"""Logs metrics for the devappserver to Google Analytics."""
def __init__(self):
"""Initializes a _MetricsLogger."""
self._client_id = None
self._user_agent = None
self._runtimes = None
self._start_time = None
self._log_once_on_stop_events = {}
def Start(self, client_id, user_agent=None, runtimes=None):
"""Starts a Google Analytics session for the current client.
Args:
client_id: A string Client ID representing a unique anonyized user.
user_agent: A string user agent to send with each log.
runtimes: A set of strings containing the runtimes used.
"""
self._start_time = Now()
self._client_id = client_id
self._user_agent = user_agent
self._runtimes = ','.join(sorted(list(runtimes))) if runtimes else None
self.Log(DEVAPPSERVER_CATEGORY, START_ACTION)
def Stop(self):
"""Ends a Google Analytics session for the current client."""
total_run_time = int((Now() - self._start_time).total_seconds()) ###### <<<<< ERROR HERE
self.LogOnceOnStop(DEVAPPSERVER_CATEGORY, STOP_ACTION, value=total_run_time)
self.LogBatch(self._log_once_on_stop_events.itervalues())
etc
_start_time
被初始化为None,从来没有更新。这是因为在调用Start
之前引发了一些异常。然后gae吃了我们的追踪。 Nom nom。
所以要调试这个错误,最好的办法是检索我们的回溯。我只是编辑我metrics.py停止功能看起来像这样:
def Stop(self):
"""Ends a Google Analytics session for the current client."""
import traceback
sErr = traceback.format_exc()
if sErr:
print(sErr)
print('===========')
total_run_time = int((Now() - self._start_time).total_seconds())
self.LogOnceOnStop(DEVAPPSERVER_CATEGORY, STOP_ACTION, value=total_run_time)
self.LogBatch(self._log_once_on_stop_events.itervalues())
现在它打印出原始的错误
对于发现这个线程其他人的回溯:@Sheena是正确的,这意味着在'_start_time'启动之前抛出错误,在我的情况下,app.yaml没有正确的格式/必要的值。这会导致dev_appserver.py在正确启动之前失败。检查你的app.yaml。 – Mathias
@Mathias我从几个不同的事情得到了这个错误。通常是因为Python代码中的错误,而不是yaml。虽然我确实认为错误可能出现在配置中,但这只是众多需要查看的地方之一。寻找异常的最佳地点通常是回溯。否则就是检查自上次运行后编辑的内容,然后再深入研究。大多数情况下,这并不好玩 – Sheena