拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Sphinx sphinx-autogen 命令完全指南:从 autosummary 指令批量生成 autodoc 存根文档

Sphinx sphinx-autogen 命令完全指南:从 autosummary 指令批量生成 autodoc 存根文档 文档开发工具【免费下载链接】sphinxThe Sphinx documentation generator项目地址https://gitcode.com/gh_mirrors/sp/sphinx点击查看免费下载autosummary扩展可以把模块、类、函数整理成清晰的摘要列表而sphinx-autogen则负责把列表中带有:toctree:选项的条目批量转成独立的 reStructuredTextreST存根文档每个存根再通过autodoc指令自动抽取目标对象的 docstring。本文以 Sphinx 仓库中官方手册页 doc/man/sphinx-autogen.rst 为主体结合 sphinx/ext/autosummary/generate.py 的源码实现与 tests/test_ext_autosummary/test_ext_autosummary.py 的测试用例完整讲解该命令的用法、每个命令行选项的语义、底层生成流程以及它与autosummary指令、sphinx.ext.autodoc扩展和自动生成配置之间的协作关系。sphinx-autogen 是什么sphinx-autogen是 Sphinx 自带的命令行工具用于“自动生成 Sphinx 源码”它读取一个或多个 reStructuredText 文档中出现的autosummary指令针对指令里列出、且设置了:toctree:选项的条目生成对应的存根文档stub page。这些存根文件内部包含autodoc系列指令如.. automodule::、.. autoclass::、.. autofunction::从而在最终构建时自动抽取目标对象的 docstring 与签名。从代码层面看sphinx-autogen只是sphinx.ext.autosummary.generate模块的前端frontend。命令行入口在 pyproject.toml 中注册为sphinx-autogen sphinx.ext.autosummary.generate:main也就是说运行sphinx-autogen等价于执行 generate.py 中的main()函数先创建一个轻量的DummyApplication无需完整加载 Sphinx 应用解析命令行参数再调用generate_autosummary_docs()完成扫描与写出。这一点也意味着sphinx-autogen与sphinx-build的构建过程解耦你可以先运行它生成存根再单独运行sphinx-build构建文档。命令格式Synopsissphinx-autogen [options] sourcefile ...sourcefile是要扫描的一个或多个 reStructuredText 文档路径这些文档中必须含有带:toctree:选项的autosummary条目。sourcefile也可以是fnmatch风格的 glob 通配模式例如*.rst、docs/*.rst命令会展开匹配到的所有文件。sourcefile解析为“相对路径”时的基准目录由base_path决定直接调用命令时以当前工作目录为基准。在源码中find_autosummary_in_files()generate.py会逐个打开文件、按行扫描出所有autosummary::指令及其条目、:toctree:、:template:、:recursive:选项值正则匹配逻辑见 generate.py。命令行选项详解sphinx-autogen的全部选项由argparse解析见 generate.py 的get_parser()与手册页一一对应选项短形式默认值作用-o outputdir--output-dir无使用:toctree:值输出目录不存在时自动创建-s suffix--suffix suffixrst生成文件使用的默认后缀-t templates--templates templatesNone自定义模板目录-i--imported-members关闭是否也文档化从其他模块导入的成员-a--respect-module-all关闭只文档化模块__all__中列出的成员--remove-old无关闭删除输出目录中不再由本次生成产生的旧文件-o outputdir指定输出目录生成文件放置的目录。若目录不存在命令会自动创建源码中通过ensuredir(path)实现见 generate.py。如果未指定-o输出目录默认取各个autosummary指令:toctree:选项的值——即存根文件写到:toctree:指向的目录里。-s suffix/--suffix suffix指定生成文件后缀生成文件的后缀默认rst。注意源码在把选项传给生成函数时会在前面补一个点号. args.suffixgenerate.py。因此若想生成 Markdown 存根可以配合支持相应解析器的 Sphinx 使用-s md。-t templates/--templates templates指定自定义模板目录默认值为None表示使用 Sphinx 自带的autosummary模板。指定后该目录会被追加到模板加载路径app.config.templates_path.append(...)见 generate.py。模板解析由AutosummaryRenderer完成它基于 Jinja2 的SandboxedEnvironment依次从“用户templates_path→ Sphinx 内置模板目录”查找模板generate.py。内置模板存放在 sphinx/ext/autosummary/templates/autosummary/ 下其中base.rst 是最简模板生成“标题下划线 .. currentmodule:: 单个.. auto{{ objtype }}::指令”module.rst 是针对模块的模板按“模块属性 / 函数 / 类 / 异常 / 子模块”分节嵌套autosummary列表子模块部分还自带:toctree:与:recursive:。模板查找规则是优先用条目:template:选项指定的模板名找不到时按对象类型回退到autosummary/objtype.rst再找不到回退到autosummary/base.rstgenerate.py。-i/--imported-members文档化导入成员默认只文档化“定义在本模块内”的成员加上-i后从其他模块导入到当前模块的成员imported判定见ModuleScanner.scan()generate.py也会被列入存根。这与 autodoc 的:imported-members:选项语义一致。-a/--respect-module-all严格遵循__all__默认情况下生成器忽略模块的__all__属性、使用dir()枚举成员加上-a后只文档化__all__中明确列出的成员。其底层开关是autosummary_ignore_module_all配置项main()中执行app.config.autosummary_ignore_module_all not args.respect_module_allgenerate.py随后members_of()依据该配置决定返回dir(obj)还是obj.__all__generate.py。--remove-old清理过期存根扫描输出目录中本次未被重新生成的文件并删除generate.py适用于源文件被重命名或删除、导致旧存根遗留的场景。注意只有当-o被指定时该选项才有意义它遍历的是args.output_dir。测试用例 test_autogen_remove_old 验证了这一点第一次运行保留无关的other.rst追加--remove-old后目录中只剩本次生成的文件。完整示例从 autosummary 到存根文档沿用手册页的示例。假设目录结构如下docs ├── index.rst └── ... foobar ├── foo │ └── __init__.py └── bar ├── __init__.py └── baz └── __init__.py且docs/index.rst中包含Modules .. autosummary:: :toctree: modules foobar.foo foobar.bar foobar.bar.baz执行$ PYTHONPATH. sphinx-autogen docs/index.rstPYTHONPATH.是为了让 Python 能导入foobar包。运行后docs下会新增modules目录及三个存根文件docs ├── index.rst └── modules ├── foobar.bar.rst ├── foobar.bar.baz.rst └── foobar.foo.rst每个存根文件内部都包含一个 autodoc 指令及若干附加信息。以默认模板 base.rst 为例foobar.foo.rst内容大致为foobar.foo .. currentmodule:: foobar .. automodule:: foobar.foo注意两点文件名就是完整限定名fully-qualified name加后缀。foobar.bar.baz对应foobar.bar.baz.rst名称中的点号保留在文件名中。存根通过.. currentmodule::声明所属模块再以.. automodule::或.. autoclass::、.. autofunction::等引用对象这样sphinx-build构建时能借助sphinx.ext.autodoc从目标对象的 docstring 中抽出签名与说明。底层生成流程源码视角sphinx-autogen的完整处理链generate.py 的generate_autosummary_docs()可以概括为四步扫描对每个源文件调用find_autosummary_in_files()解析出所有autosummary条目得到(name, path/toctree, template, recursive)四元组即AutosummaryEntry。过滤跳过那些没有:toctree:选项的条目entry.path is None时continuegenerate.py。这正是手册中“必须带有:toctree:选项”这一前提的实现位置。导入通过import_by_name()sphinx/ext/autosummary/init.py按名称解析 Python 对象若按模块导入失败还会尝试按“实例属性”instance attribute方式解析import_ivar_by_name()。所有失败会被聚合成ImportExceptionGroup并给出“Possible hints”形式的诊断信息。渲染与写出generate_autosummary_content()根据对象类型module / class / method / attribute / property 等组织模板上下文成员、函数、类、异常、属性、继承成员、模块列表等交给AutosummaryRenderer渲染随后写入output_dir / (autosummary_filename_map.get(name, name) suffix)generate.py。如果目标文件已存在且内容未变则跳过写入避免无谓的改动。生成是递归的若新生成的存根本身又包含带:toctree:的autosummary例如模块模板中的子模块分节生成器会把新文件作为输入再次调用自身generate.py。配合:recursive:选项即可一键展开整个包层级。与 autosummary 指令的协作细节autosummary指令本身定义在 sphinx/ext/autosummary/init.py负责渲染摘要表格并在设置了:toctree:时把一个隐藏的 toctree 节点加入文档。它与sphinx-autogen的分工是构建期sphinx-build如果autosummary_generate配置开启Sphinx 会在builder-inited事件中自动调用同一套generate_autosummary_docs()见init.py 的process_generate_options与 doc/usage/extensions/autosummary.rst 的autosummary_generate配置说明无需手动运行命令。命令期sphinx-autogen当你想把“生成存根”与“构建文档”分开、或只针对某些文件生成、或引入自定义模板与清理策略时手动运行本命令。在sphinx-build构建时若:toctree:指向的存根文件缺失Sphinx 会给出类似autosummary: stub file not found ... Check your autosummary_generate setting的警告init.py。此时有两种修复路径开启autosummary_generate自动生成或手动运行sphinx-autogen补齐存根。指令选项对生成的影响autosummary指令支持以下选项init.py其中与sphinx-autogen生成行为直接相关的有:toctree: DIRNAME必选。决定存根输出目录未指定-o时与隐藏 toctree 的前缀。:recursive:允许对包递归生成子模块存根测试 test_autosummary_recursive 验证了带与不带该选项时的文件生成差异。:template: TEMPLATENAME为该列表条目指定自定义模板名。:caption:、:signatures:none/short/long、:nosignatures:、:class:只影响摘要表格的呈现不影响存根生成。自动生成时的相关配置当改用autosummary_generate自动生成时以下配置均在init.py 中注册与命令选项一一呼应autosummary_generate默认True可设布尔值或文档列表控制扫描哪些文档autosummary_generate_overwrite默认True对应overwrite参数控制已存在存根是否被覆盖autosummary_imported_members默认False对应-iautosummary_ignore_module_all默认True与-a相反语义autosummary_mock_imports对无法导入的第三方依赖打桩避免生成失败autosummary_filename_map把对象名映射为自定义文件名可用于规避文件名大小写或特殊字符问题autosummary_context向模板上下文注入额外变量。常见用法与注意事项一次性生成全目录存根sphinx-autogen -o generated *.rst读取所有匹配文件的autosummary表格并输出到generated/官方用法示例见 doc/usage/extensions/autosummary.rst。放在 Makefile 中generate.py 模块 docstring 中就给出了 Makefile 规则示例sphinx-autogen -o source/generated source/*.rst。导入失败处理目标对象依赖第三方库而当前环境未安装时导入会失败并产生告警可先通过PYTHONPATH保证模块可见或在自动生成场景下配置autosummary_mock_imports。--remove-old与-o配合目录清理只针对-o指定的输出目录未指定-o时该选项无效。-s后缀会原样影响文件名默认rst下生成foobar.foo.rst改用-s md则生成foobar.foo.md需 Sphinx 配置了对应的源解析器才能被构建识别。关联命令sphinx-autogen属于 Sphinx 的“附加应用”additional application与核心工具sphinx-build、以及同为附加工具的sphinx-apidoc配合使用sphinx-apidoc从包结构整体生成 API 文档骨架手册页sphinx-autogen则按autosummary指令精确生成单个对象的存根页。完整的命令行工具清单见 doc/man/index.rst。赞分享文档开发工具【免费下载链接】sphinxThe Sphinx documentation generator项目地址https://gitcode.com/gh_mirrors/sp/sphinx点击查看免费下载相关推荐Sphinx 自动文档生成指南用 autodoc 与 autosummary 从源码生成 API 文档Sphinx 自动文档生成指南用 autodoc 与 autosummary 从源码生成 API 文档 本文是 Sphinx 官方教程从代码自动生成文档一文档开发工具Sphinx 命令行工具完全指南sphinx-build、sphinx-quickstart、sphinx-apidoc 与 sphinx-autogen 实战手册Sphinx 命令行工具完全指南sphinx build、sphinx quickstart、sphinx apidoc 与 sphinx autogen 实文档开发工具浏览器跑大模型太吃配置WebLLM的WASM推理库定制与排错指南浏览器跑大模型太吃配置WebLLM的WASM推理库定制与排错指南 你是不是也遇到过想在大模型里加个私有化能力可服务器成本和数据出域总让你打退堂鼓WebL文档开发工具上一篇【免费下载】 网易云音乐API使用教程下一篇Spring Boot Klock Starter 教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表