2017-05-03 1 views
1

Ich habe viele Wiederholungen dieser Frage und viele ziemlich spezifische und nutzlose Ansers gesehen. Die Frage ist so etwas wie:GAE devappserver2 TypeError: nicht unterstützte Operandentyp (en) für -: 'datetime.datetime' und 'NoneType'

Wenn dev_appserver.py app.yaml läuft ich einen Fehler wie so:

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' 

Wie funktioniert ein Debug das?

Antwort

2

Im Innern des metrics.py Skript in dem Fehler erwähnt werden Sie etwas sehen:

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 wurde auf None initialisiert und wurde nie aktualisiert. Dies liegt daran, dass eine Ausnahme ausgelöst wurde, bevor Start aufgerufen wurde. Und dann haben wir unsere Rückverfolgung gegessen. Nom nom.

Um diesen Fehler zu debuggen, ist es das Beste, unser Traceback zu erhalten. i bearbeiten gerade Funktion meiner metrics.py Stopp wie so aussehen:

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

Jetzt druckt er die Zurückverfolgungs des ursprünglichen Fehlers aus

+1

Für andere Menschen, die in dieses Thema zu finden: @Sheena richtig ist, dass es bedeutet, dass ein Fehler ausgelöst wurde, bevor '_start_time' initiiert wurde und in meinem Fall war es der app.yaml hatte nicht das richtige Format/notwendige Werte. Dies führt dazu, dass dev_appserver.py fehlschlägt, bevor es korrekt gestartet wird. Überprüfen Sie "app.yaml". – Mathias

+1

@Mathias Ich habe diesen Fehler von ein paar verschiedenen Dingen bekommen. Normalerweise wegen Fehlern im Python-Code, nicht der Yaml. Während ich denke, dass Fehler in der Konfiguration auftreten können, ist nur einer von vielen Orten zu sehen. Der beste Ort, um nach einer Ausnahme zu suchen, ist normalerweise das Traceback. Ansonsten geht es darum, zu überprüfen, was Sie seit dem letzten Lauf bearbeitet haben, und danach zu graben. Was meistens kein Spaß ist – Sheena

Verwandte Themen