Python 如何将Sphinx警告重定向到stdout,但将错误保留在stderr中

Python 如何将Sphinx警告重定向到stdout,但将错误保留在stderr中,python,stdout,python-sphinx,stderr,Python,Stdout,Python Sphinx,Stderr,在Sphinx构建中,所有警告和错误都写在stderr中。但是,我只希望在stderr中写入错误,在stdout中写入警告 有什么方法可以实现这一点吗?除非您将斯芬克斯作为一个包加载并对其机械进行修补,否则无法更改: sphinx\cmdline.py: <...> def main(argv=sys.argv[1:]): <...> status = sys.stdout warning = sys.stderr error = sys.stde

在Sphinx构建中,所有警告和错误都写在
stderr
中。但是,我只希望在
stderr
中写入错误,在
stdout
中写入警告


有什么方法可以实现这一点吗?

除非您将
斯芬克斯作为一个包加载并对其机械进行修补,否则无法更改:

sphinx\cmdline.py

<...>
def main(argv=sys.argv[1:]):
<...>
    status = sys.stdout
    warning = sys.stderr
    error = sys.stderr

    if args.quiet:
        status = None

    if args.really_quiet:
        status = warning = None

    if warning and args.warnfile:
        try:
            warnfp = open(args.warnfile, 'w')
        <...>
        warning = Tee(warning, warnfp)  # type: ignore
        error = warning

    <...>
        with patch_docutils(), docutils_namespace():
            app = Sphinx(srcdir, confdir, outdir, doctreedir, args.builder,
                         confoverrides, status, warning, args.freshenv,
                         args.warningiserror, args.tags, args.verbosity, args.jobs)
            app.build(args.force_all, filenames)
            return app.statuscode

def main(argv=sys.argv[1:]):
状态=sys.stdout
警告=sys.stderr
错误=sys.stderr
如果args.quiet:
状态=无
如果args.really_quiet:
状态=警告=无
如果警告和args.warn文件:
尝试:
warnfp=open(args.warnfp文件'w')
警告=T形三通(警告,警告FP)#类型:忽略
错误=警告
使用修补程序\u docutils(),docutils\u命名空间()
app=Sphinx(srcdir、confdir、outdir、doctreedir、args.builder、,
混淆、状态、警告、args.freshNV、,
args.warningiserror、args.tags、args.verbosity、args.jobs)
app.build(args.force_all,文件名)
返回app.statuscode

正如您所看到的,
Sphinx
甚至没有一个单独的错误和警告构造函数参数。

这是一种奇怪的要求。stdout代表程序的结果(其思想是它可以被管道中的下一个程序解析),stderr代表任何不属于它的部分。你想达到什么目的?谢谢你的帮助。在我的运行时环境中,写入stderr的内容将触发失败。我不希望警告消息触发故障,只有错误才应该这样做。那么,也许是您的环境需要修补。根据我先前的消息。也许您的sentinel可以使用用户提供的正则表达式来检测错误/非错误消息。或者,您的环境在设计时似乎考虑到将警告视为错误,这是一种有效且合理的思维方式,适用于具有高可靠性要求的域,如内核驱动程序和嵌入式系统(和CPython pull请求:))。因此,为了与它保持一致,您不应该忽略警告,相反:直接
sphinx
将它们视为错误。毕竟,
sphinx
警告意味着生成的文档中的某些内容无法工作。听起来很合理。谢谢你的建议。