2013-06-20 33 views
16

我還是一個新的Python,使用熊貓,我有一些問題調試我的Python腳本。如何找出哪裏的Python警告是從

我有以下警告消息:

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

,並不能找到它來自的。

經過一番研究,我試圖做的是,在熊貓庫文件(index.py):

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

但是,這並沒有改變有關的警告信息任何東西。

+0

我認爲最簡單的方法是強制它提高,然後你可以正常調試。 –

回答

14

可以filter the warnings提高,這將使你調試(例如,使用PDB):

import warnings 
warnings.filterwarnings('error') 

*的warnings filter可以更精細地(這可能是更合適)管理如:

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

多個過濾器將按順序查找。 (「條目越接近後面的列表清單覆蓋項的前面,如果兩個匹配特定的警告」。)

+0

我正在觀察添加更廣泛的警告(在驅動程序腳本中)導致驅動程序使用的模塊沒有錯誤或警告的情況,而當我不使用警告時,我會看到警告。任何這方面的經驗? – HaPsantran

+0

@HaPsantran請問這是一個新的問題,這樣它會得到更多的關注。感受自由的CC我在這裏與新問題的鏈接。我不確定我是否追隨你,但這裏的重點是圖書館可能會發出警告,並且我們希望將其作爲例外(因此我們可以更輕鬆地解決該警告)。 –

0

如果啓用Python記錄,則當接收到異常時,您可以使用該方法logging.exception登錄時異常被抓住了 - 這種方法將打印出一個很好的格式化的堆棧跟蹤顯示你到底在代碼中發生異常。有關更多信息,請參閱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') 

或者,你可以通過調用sys.exc_info()包含在代碼中異常的細節的元組(這需要您導入sys模塊)。

+0

謝謝,但也沒有改變警告消息,除了行號(仍在'return self._engine.get_loc(key)')。 這很奇怪,但我想這將是因爲它是一個庫,所以它使用編譯(.pyc)文件? **你通常如何調試來自庫的警告**? – Bonswouar

+0

啊,所以你沒有源代碼 - 這讓生活變得困難!你能掌握源代碼嗎?如果不是,那麼我會開始嘗試將不同的數據傳遞到封閉的庫中,以查看是否可以分離出您提供的導致錯誤的數據。作爲最後的手段,反編譯該庫(例如使用[dis](http://docs.python.org/2/library/dis.html))並調試到反編譯的源文件可能是唯一的方法去到它的底部。 – robjohncox

+0

我有源代碼(所有.pyc .py和.pyo文件一起),但(如何)我應該重新編譯它使其工作? – Bonswouar

6

您也可以使用命令行來控制警告:

python -W error::UnicodeWarning your_code.py 

從手冊頁:

-W參數
[...] 錯誤,以提高打印的警告消息的異常,而不是。

這將是把下面的代碼相同的效果:

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

正如已經在安迪的回答說。

相關問題