Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-同时使用日志和警告模块抛出';TypeError:应为字符缓冲区对象';_Python_Logging_Warnings - Fatal编程技术网

python-同时使用日志和警告模块抛出';TypeError:应为字符缓冲区对象';

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) #

我试图在python脚本中同时使用
日志记录
警告
模块。我想使用
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
    ,因为它不是字符或缓冲区对象