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()) 

现在它打印出原始的错误

+1

对于发现这个线程其他人的回溯:@Sheena是正确的,这意味着在'_start_time'启动之前抛出错误,在我的情况下,app.yaml没有正确的格式/必要的值。这会导致dev_appserver.py在正确启动之前失败。检查你的app.yaml。 – Mathias

+1

@Mathias我从几个不同的事情得到了这个错误。通常是因为Python代码中的错误,而不是yaml。虽然我确实认为错误可能出现在配置中,但这只是众多需要查看的地方之一。寻找异常的最佳地点通常是回溯。否则就是检查自上次运行后编辑的内容,然后再深入研究。大多数情况下,这并不好玩 – Sheena