2013-06-20 2 views
16

Ich bin immer noch ein bisschen neu mit Python, mit Pandas, und ich habe einige Probleme bei der Fehlersuche mein Python-Skript.Wie finde ich heraus, wo eine Python-Warnung ist von

Ich habe die folgende Warnmeldung bekam:

[...]\pandas\core\index.py:756: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 
return self._engine.get_loc(key) 

Und kann nicht finden, wo es herkommt.

Nach einigen Recherchen habe ich versucht, dass in der Pandas Lib-Datei (index.py) zu tun:

try: 
    return self._engine.get_loc(key) 
except UnicodeWarning: 
    warnings.warn('Oh Non', stacklevel=2) 

Aber das nichts über die Warnmeldung nicht ändern.

+0

Ich denke, der einfachste Weg ist es zu erzwingen, dann können Sie wie gewohnt debuggen. –

Antwort

14

Sie können filter the warnings zu erhöhen, die Sie debuggen (zB mit PDB) ermöglichen:

import warnings 
warnings.filterwarnings('error') 

* Die warnings filter kann feiner verwaltet werden (was wahrscheinlich besser geeignet ist) zB:

warnings.filterwarnings('error', category=UnicodeWarning) 
warnings.filterwarnings('error', message='*equal comparison failed*') 

Mehrere Filter werden nacheinander gesucht. („-Einträge näher an der Vorderseite der Listenüberschreibung Einträge später in der Liste, wenn beide eine besondere Warnung entsprechen.“)

+0

Ich beobachte Fälle, bei denen das Hinzufügen der breiteren Warnung (in einem Treiberskript) zu keinem Fehler ODER zu einer Warnung führt, was zu dem Modul führt, das der Treiber verwendet, wohingegen ich, wenn ich KEINE Warnungen verwende, die Warnung sehe. Irgendwelche Erfahrungen damit? – HaPsantran

+0

@HaPsantran bitte fragen Sie dies als eine neue Frage, so wird es mehr Aufmerksamkeit bekommen. Fühlen Sie sich frei das CC mich hier mit einem Link zu der neuen Frage. Ich bin mir nicht sicher, ob ich dir folge, aber der Punkt hier ist, dass eine Bibliothek warnen kann und wir wollen dies zu einer Ausnahme machen (damit wir diese Warnung leichter beheben können). –

0

Wenn Sie die Anmeldung in Python aktivieren, können Sie beim Eintreffen einer Ausnahme die Methode logging.exception verwenden, um eine Ausnahme abzufangen - diese Methode wird einen schön formatierten Stack-Trace ausgeben, der Sie genau im Code zeigt die Ausnahme ist entstanden. Weitere Informationen finden Sie unter python document on logging.

import logging 
log = logging.getLogger('my.module.logger') 

try: 
    return self._engine.get_loc(key) 
except UnicodeWarning: 
    log.exception('A log message of your choosing') 

Alternativ können Sie auch ein Tupel erhalten, die Details der Ausnahme im Code enthält von sys.exc_info() Aufruf (dies erfordert, dass Sie das sys Modul zu importieren).

+0

Danke aber das änderte auch nicht die Warnmeldung, außer der Zeilennummer (immer noch auf 'return self._engine.get_loc (key)'). Das ist seltsam, aber ich denke, das wäre, weil es eine Lib ist, so dass es die kompilierte (.pyc) Datei verwendet? ** Wie debugge ich normalerweise Warnungen von libs **? – Bonswouar

+0

Ah, damit Sie nicht den Quellcode haben - das macht das Leben schwierig! Kannst du den Quellcode bekommen?Wenn nicht, dann würde ich damit beginnen, mit der Übergabe anderer Daten in die geschlossene Bibliothek zu experimentieren, um zu sehen, ob Sie isolieren können, was es mit den Daten zu tun hat, die den Fehler verursachen. Als letzter Ausweg kann das Dekompilieren der Bibliothek (zum Beispiel mit [dis] (http://docs.python.org/2/library/dis.html)) und das Debuggen in die dekompilierte Quelle der einzige Weg sein, um zu der unten davon. – robjohncox

+0

Ich habe den Quellcode (alle .pyc .py und .pyo Dateien zusammen), aber (wie) sollte ich es neu kompilieren, damit es funktioniert? – Bonswouar

6

Sie auch die Kommandozeile verwenden können, um die Warnungen zu steuern:

python -W error::UnicodeWarning your_code.py 

Aus der Mann Seite:

-W Argument
[...] Fehler eine Ausnahme statt Druck eine Warnmeldung zu erhöhen.

Dies wird die gleiche Wirkung wie setzen Sie den folgenden in Ihrem Code haben:

import warnings 
warnings.filterwarnings('error', category=UnicodeWarning) 

Wie bereits in Andys Antwort gesagt wurde.