在 sphinx-build 文档生成期间检测 conf.py 中的输出格式

Detect output format in conf.py during sphinx-build documentation generation

我正在将 Sphinx 的一些问题的解决方法直接添加到 conf.py 文件中。我想写这样的代码:

if documentation_will_be_generated_as_HTML():
    my_workaround_for_html_docs()
else:
    my_workaround_for_the_rest_of_the_formats()

如何为 Sphinx 编写谓词 documentation_will_be_generated_as_HTML()

P.S。我知道做这样的变通办法不好,最好把它们做成延期,但最后期限很严格。

您可以查看 conf.pysys.argv 的内容来确定 buildername is being passed when you execute sphinx-build。 (这是最简单直接的方法)。

sys.argv 包含的内容取决于您调用 sphinx-build 的方式。如果您使用 make html 基本上您是在调用 make 文件并将构建器名称 html 作为第二个参数传递(但是 makfile 将在调用 sphinx-build 之前对您的命令行调用进行更多更改).

然后在 conf.py 内部检查 sys.argv[2] 应该包含 html。 (makefile 通常由 sphinx-quickstart 生成,并且可能因操作系统而异。)

从 Windows 上的 Sphinx make.bat 批处理文件中突出显示相关行的摘录:

if "%SPHINXBUILD%" == "" (
    set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=source
set BUILDDIR=build

%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%

这是一个更复杂的 运行ning sphinx-build 示例,直接从带有显式参数的命令行(不使用 makefile),它看起来像下面,在这种情况下 sys.argv[3] 包含构建器名称。

>>> sys.argv
['C:/my_venv/Lib/site-packages/sphinx/cmd/build.py', '-E', '-b', 'html', '-d', 'build/doctrees', 'source', 'build/html']

>>> sys.argv[3]
html

总而言之,取决于您 运行 Sphinx 如何检查 sys.argv 包含在 conf.py 中的内容并相应地编写您的条件。在我们的示例中,取决于您调用 sphinx-build(或 make html)的精确程度:

def documentation_will_be_generated_as_HTML():
    if sys.argv[3] == 'html'
        return True


if documentation_will_be_generated_as_HTML():
    my_workaround_for_html_docs()
else:
    my_workaround_for_the_rest_of_the_formats()

您可以使用 Sphinx 的应用程序 API 和事件处理功能来确定当前 运行 的构建器。参见 https://www.sphinx-doc.org/en/master/extdev/appapi.html

source-read 事件的处理程序可能如下所示:

def workaround(app, docname, source):
    if app.builder.name == "html":
        my_workaround_for_html_docs()
    else:
        my_workaround_for_the_rest_of_the_formats()
 
def setup(app):
    app.connect("source-read", workaround)

其他一些活动可能更适合您的具体情况。