我正在尝试在python脚本中同时使用logging
和warnings
模块。我想使用warnings.warn()
记录警告,但仍然使用我为记录器设置的格式。
我正在调用logging.captureWarnings(True)
并用我自己的函数替换warnings.formatwarning()
。我的代码如下所示:
def _my_format_warning(message, category, filename, lineno, line=None):
logging.warning(message)
# ... rest of code
# setup in main function:
logging.basicConfig(format='[%(asctime)s] %(levelname)s: %(message)s', level=logging.WARNING)
logging.captureWarnings(True)
warnings.formatwarning=_my_format_warning
测试各种选项:
如果我没有用我自己的函数覆盖warnings.formatwarning()
,我会得到内置的警告格式,其中包含我不想要的换行符和字段(在粗体<中标记如下) /强>):
[2015-01-07 21:40:43,436]警告: robots.py:435:UserWarning:机器人原理图包含少于1个激光附件。
“激光附件。”。格式(self.MIN_RECOMMENDED_LASERS)
如果我覆盖warnings.formatwarning()
但未调用logging.captureWarnings(True)
,我的脚本会因异常而崩溃:
[2015-01-07 21:40:43,436]警告:机器人原理图包含少于1个激光附件 追溯(最近的呼叫最后):
文件“robots.py”,第435行,在activate()中 “激光附件。”格式(self.MIN_RECOMMENDED_LASERS)
文件“warnings.py”,第29行,在_show_warning中 file.write(formatwarning(message,category,filename,lineno,line))
TypeError:期望一个字符缓冲区对象
怎么了?
答案 0 :(得分:0)
warnings.formatwarning()
的{p> The specification表示&#34;此[function]返回一个字符串&#34;。这意味着要完全实现函数接口,你的函数也必须返回一个字符串。
更改您的函数以返回要作为字符串打印的警告消息。像这样:
def _my_format_warning(message, category, filename, lineno, line=None):
return message
然后,您可以使用自己的功能调用logging.captureWarnings(True)
并覆盖warnings.formatwarning()
,并且警告将以所需的格式正确打印。
错误消息TypeError: expected a character buffer object
正在发生,因为warnings.showwarning()
正在尝试将自定义_my_format_warning()
函数返回的值写入std.out
,但无法解决。由于您的函数没有返回任何内容,因此默认情况下会返回None
(see here)。 Python无法向None
打印任何警告消息,因为它不是字符或缓冲区对象。