python-同时使用日志和警告模块抛出';TypeError:应为字符缓冲区对象';
我试图在python脚本中同时使用python-同时使用日志和警告模块抛出';TypeError:应为字符缓冲区对象';,python,logging,warnings,Python,Logging,Warnings,我试图在python脚本中同时使用日志记录和警告模块。我想使用warnings.warn()记录警告,但仍让它们使用我为记录器设置的格式 我正在调用logging.captureWarnings(True)并用自己的函数替换warnings.formatwarning()。我的代码如下所示: def _my_format_warning(message, category, filename, lineno, line=None): logging.warning(message) #
日志记录
和警告
模块。我想使用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:43436]警告:机器人。py:435:UserWarning:机器人示意图包含的激光附件少于1个。激光附件..format(self.MIN\u推荐的激光)
warnings.formatWarnings()
,但没有调用logging.capturewanings(True)
,我的脚本会在异常时崩溃:
[2015-01-07 21:40:43436]警告:机器人示意图包含的激光附件少于1个。回溯(最近一次呼叫最后一次):
激活()中第435行的文件“robots.py”
“激光附件”。.format(self.MIN\u推荐的激光)
文件“warnings.py”,第29行,在\u show\u warning中
file.write(格式警告(消息、类别、文件名、行号、行))
TypeError:应为字符缓冲区对象
警告。formatwarning()
说“此[函数]返回字符串”。这意味着要完全实现函数接口,函数还必须返回字符串
更改函数以返回要以字符串形式打印的警告消息。像这样:
def _my_format_warning(message, category, filename, lineno, line=None):
return message
然后,您可以使用自己的函数调用logging.captureWarnings(True)
并覆盖warnings.formatwarning()
,警告将以所需格式正确打印
错误消息TypeError:由于警告,应出现字符缓冲区对象。showwarning()
正在尝试将自定义\u my\u format\u warning()
函数返回的值写入std.out
,但无法写入。由于函数不返回任何内容,因此默认情况下会返回None
)。Python无法将任何警告消息打印到None
,因为它不是字符或缓冲区对象