如何找出Python警告的来源

时间:2013-06-20 08:15:00

标签: python debugging warnings pandas

使用Pandas,我仍然是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)

无法找到它的位置。

经过一些研究,我试图在Pandas lib文件(index.py)中这样做:

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

但这并没有改变警告信息。

4 个答案:

答案 0 :(得分:23)

您可以filter the warnings加注,这将使您能够调试(例如使用pdb):

import warnings
warnings.filterwarnings('error')

* warnings filter可以更精细地管理(这可能更合适),例如:

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

将按顺序查找多个过滤器。 (“如果两者都匹配特定警告,则靠近列表前面的条目会覆盖列表后面的条目。”)

答案 1 :(得分:9)

您还可以使用命令行来控制警告:

python -W error::UnicodeWarning your_code.py

从手册页:

  

-W参数
  [...] 错误引发异常,而不是打印警告消息。

这与在代码中添加以下内容具有相同的效果:

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

正如Andy的回答中已经说过的那样。

答案 2 :(得分: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模块)。

答案 3 :(得分:0)

调查警告的最有用的方法是将其转换为错误(Exception),以便查看其完整的堆栈跟踪:

import warnings
warnings.simplefilter("error")

请参见warnings