python - 使用日志记录和警告模块抛出'TypeError:期望一个字符缓冲区对象'

时间:2015-01-08 06:17:02

标签: python logging warnings

我正在尝试在python脚本中同时使用loggingwarnings模块。我想使用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

测试各种选项:

  1. 如果我没有用我自己的函数覆盖warnings.formatwarning(),我会得到内置的警告格式,其中包含我不想要的换行符和字段(在粗体<中标记如下) /强>):

      

    [2015-01-07 21:40:43,436]警告: robots.py:435:UserWarning:机器人原理图包含少于1个激光附件。
      “激光附件。”。格式(self.MIN_RECOMMENDED_LASERS)

  2. 如果我覆盖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:期望一个字符缓冲区对象

  3. 怎么了?

1 个答案:

答案 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,但无法解决。由于您的函数没有返回任何内容,因此默认情况下会返回Nonesee here)。 Python无法向None打印任何警告消息,因为它不是字符或缓冲区对象。