2013-06-20 4 views
16

Wciąż jestem trochę nowy w Pythonie, używając Pand i mam kilka problemów przy debugowaniu skryptu Python.Jak dowiedzieć się, skąd się bierze Ostrzeżenie Pythona od

Mam następujący komunikat ostrzegawczy:

[...]\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) 

I nie można znaleźć gdzie to pochodzi.

Po kilku badań, próbowałem to zrobić w pliku lib Pandy (index.py):

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

Ale to nic na temat komunikatu ostrzegawczego nie uległ zmianie.

+0

Myślę, że najłatwiej jest zmusić go do podniesienia, a następnie można debugować jak zwykle. –

Odpowiedz

14

Można filter the warnings podnieść który pozwoli Ci debugowania (np używając WPB):

import warnings 
warnings.filterwarnings('error') 

* The warnings filter może być zarządzany bardziej precyzyjnie (co jest prawdopodobnie bardziej odpowiednia), np:

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

Poszczególne filtry będą wyszukiwane sekwencyjnie. („Wpisy bliżej przedniej części zapisów lista zastępują później na liście, jeśli zarówno dopasować dany ostrzeżenie.”)

+0

Obserwuję przypadki, w których dodanie ogólnego ostrzeżenia (w skrypcie sterownika) nie powoduje żadnego błędu LUB ostrzeżenia powodującego użycie modułu, którego używa sterownik, natomiast gdy NIE używam ostrzeżeń, widzę ostrzeżenie. Jakieś doświadczenie z tym? – HaPsantran

+0

@HaPsantran zadaj to pytanie jako nowe, w ten sposób zyskasz więcej uwagi. Zapraszam do CC tutaj z linkiem do nowego pytania. Nie jestem pewien, czy podążam za tobą, ale chodzi o to, że biblioteka może ostrzec i chcemy uczynić to wyjątkiem (abyśmy mogli łatwiej naprawić to ostrzeżenie). –

0

Jeśli włączysz logowanie w pythonie, to po otrzymaniu wyjątku możesz użyć metody logging.exception do rejestrowania, kiedy zostanie wychwycony wyjątek - ta metoda wydrukuje ładnie sformatowany ślad stosu, który pokazuje dokładnie w kodzie gdzie powstał wyjątek. Aby uzyskać więcej informacji, patrz 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') 

Alternatywnie, można uzyskać krotki, która zawiera szczegółowe informacje o wyjątku w kodzie przez wywołanie sys.exc_info() (ta wymaga, aby zaimportować moduł sys).

+0

Dzięki, ale to również nie zmieniło komunikatu ostrzegawczego, z wyjątkiem numeru linii (nadal na 'return self._engine.get_loc (key)'). To dziwne, ale myślę, że to dlatego, że jest to lib, więc używa skompilowanego (.pyc) pliku? ** Jak zwykle debugujesz ostrzeżenia z bibliotek **? – Bonswouar

+0

Ach, więc nie masz kodu źródłowego - to utrudnia życie! Czy możesz zdobyć kod źródłowy?Jeśli nie, to zacznę eksperymentować z przekazywaniem różnych danych do zamkniętej biblioteki, aby sprawdzić, czy można wyodrębnić, co dotyczy dostarczanych danych, które powodują błąd. W ostateczności dekompilowanie biblioteki (na przykład za pomocą [dis] (http://docs.python.org/2/library/dis.html)) i debugowanie w zdekompilowanym źródle może być jedynym sposobem na uzyskanie dostępu do na dole. – robjohncox

+0

Mam kod źródłowy (wszystkie pliki .pyyc .py i .pyo razem), ale (jak) powinienem je skompilować, aby działał? – Bonswouar

6

Można również użyć wiersza poleceń do sterowania ostrzeżenia:

python -W error::UnicodeWarning your_code.py 

Od strona man:

-W argumentem
[...] błąd podnieść wyjątek zamiast drukować komunikat ostrzegawczy.

To będzie mieć taki sam skutek, jak umieszczenie następujących w kodzie:

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

Jak zostało już powiedziane w odpowiedzi Andy'ego.