如何抑制或禁用reSTructuredText中的警告?

8 投票
2 回答
1245 浏览
提问于 2025-04-16 06:20

我正在用Python开发一个内容管理系统(CMS),它使用reStructuredText(通过docutils)来格式化内容。我的很多内容都是从其他地方导入的,通常是一些没有格式的文本文件。reST在这方面表现得很好,因为它默认会让所有内容看起来比较整洁。

不过,我遇到一个问题,就是我的网页服务器会把警告信息输出到错误日志中,并且这些警告还会出现在我的页面内容里。比如,我在网页上看到的警告信息是这样的:

系统消息:警告/2(第296行);反向链接

我想问的是:我该如何抑制、禁用或者以其他方式重定向这些警告信息呢?

理想情况下,我希望能把这些警告写入一个日志文件,但如果有人能告诉我怎么让这些警告不出现在我的内容里,那就太好了。

负责将reST解析成HTML的代码如下:

from docutils import core
import reSTpygments

def reST2HTML( str ):
    parts = core.publish_parts(
                          source = str,
                          writer_name = 'html')
    return parts['body_pre_docinfo'] + parts['fragment']

2 个回答

3

看起来,report_level这个字符串参数是个旧版本。现在,下面的代码对我来说是有效的。

import docutils.core
import docutils.utils
from pathlib import Path

shut_up_level = docutils.utils.Reporter.SEVERE_LEVEL + 1
docutils.core.publish_file(
    source_path=Path(...), destination_path=Path(...),
    settings_overrides={'report_level': shut_up_level},
    writer_name='html')

关于级别

# docutils.utils.__init__.py
class Reporter(object):
    # system message level constants:
    (DEBUG_LEVEL,
     INFO_LEVEL,
     WARNING_LEVEL,
     ERROR_LEVEL,
     SEVERE_LEVEL) = range(5)

    ...

    def system_message(self, level, message, *children, **kwargs):
        ...
        if self.stream and (level >= self.report_level  # self.report_level was set by you. (for example, shut_up_level)
                    or self.debug_flag and level == self.DEBUG_LEVEL
                    or level >= self.halt_level):
            self.stream.write(msg.astext() + '\n')
        ...
        return msg

根据上面的代码,你可以知道可以给self.report_level(也就是settings_overrides={'report_level': ...})赋值,这样就可以让警告不显示。

我把它设置为SERVER_LEVEL+1,这样就不会显示任何错误。(你可以根据自己的需求来设置。

11
def reST2HTML( str ):
    parts = core.publish_parts(
    source = str,
    writer_name = 'html',
    settings_overrides={'report_level':'quiet'},
    )
    return parts['body_pre_docinfo'] + parts['fragment']

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答