简体   繁体   English

Sphinx autodoc 不够自动化

[英]Sphinx autodoc is not automatic enough

I'm trying to use Sphinx to document a 5,000+ line project in Python.我正在尝试使用 Sphinx 在 Python 中记录一个 5,000 多行的项目。 It has about 7 base modules.它有大约 7 个基本模块。 As far as I know, In order to use autodoc I need to write code like this for each file in my project:据我所知,为了使用 autodoc,我需要为项目中的每个文件编写这样的代码:

.. automodule:: mods.set.tests
    :members:
    :show-inheritance:

This is way too tedious because I have many files.这太乏味了,因为我有很多文件。 It would be much easier if I could just specify that I wanted the 'mods' package to be documented.如果我可以指定我想要记录“mods”包,那会容易得多。 Sphinx could then recursively go through the package and make a page for each submodule. Sphinx 然后可以递归地遍历包并为每个子模块创建一个页面。

Is there a feature like this?有这样的功能吗? If not I could write a script to make all the .rst files, but that would take up a lot of time.如果没有,我可以编写一个脚本来制作所有 .rst 文件,但这会占用很多时间。

You can check thisscript that I've made.你可以查看我制作的这个脚本 I think it can help you.我认为它可以帮助你。

This script parses a directory tree looking for python modules and packages and creates ReST files appropriately to create code documentation with Sphinx.此脚本解析目录树以查找 python 模块和包,并适当地创建 ReST 文件以使用 Sphinx 创建代码文档。 It also creates a modules index.它还创建一个模块索引。

UPDATE更新

This script is now part of Sphinx 1.1 as apidoc .这个脚本现在作为apidoc成为 Sphinx 1.1 的 一部分

From Sphinx version 3.1 (June 2020), sphinx.ext.autosummary (finally!) has automatic recursion.从 Sphinx 3.1 版(2020 年 6 月)开始, sphinx.ext.autosummary (终于!)具有自动递归功能。

So no need to hard code module names or rely on 3rd party libraries like Sphinx AutoAPI or Sphinx AutoPackageSummary for their automatic package detection any more.因此,不再需要硬编码模块名称或依赖第 3 方库(如Sphinx AutoAPISphinx AutoPackageSummary)来进行自动包检测。

Example Python 3.7 package to document ( see code on Github and result on ReadTheDocs ):要记录的示例 Python 3.7 包( 参见 Github 上的 代码ReadTheDocs 上的结果):

mytoolbox
|-- mypackage
|   |-- __init__.py
|   |-- foo.py
|   |-- mysubpackage
|       |-- __init__.py
|       |-- bar.py
|-- doc
|   |-- source
|       |--index.rst
|       |--conf.py
|       |-- _templates
|           |-- custom-module-template.rst
|           |-- custom-class-template.rst

conf.py : conf.py

import os
import sys
sys.path.insert(0, os.path.abspath('../..'))  # Source code dir relative to this file

extensions = [
    'sphinx.ext.autodoc',  # Core library for html generation from docstrings
    'sphinx.ext.autosummary',  # Create neat summary tables
]
autosummary_generate = True  # Turn on sphinx.ext.autosummary

# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']

index.rst (note new :recursive: option): index.rst (注意新的:recursive:选项):

Welcome to My Toolbox
=====================

Some words.

.. autosummary::
   :toctree: _autosummary
   :template: custom-module-template.rst
   :recursive:

   mypackage

This is sufficient to automatically summarise every module in the package, however deeply nested.这足以自动总结包中的每个模块,无论嵌套有多深。 For each module, it then summarises every attribute, function, class and exception in that module.对于每个模块,它然后总结该模块中的每个属性、函数、类和异常。

Oddly, though, the default sphinx.ext.autosummary templates don't go on to generate separate documentation pages for each attribute, function, class and exception, and link to them from the summary tables.但奇怪的是,默认的sphinx.ext.autosummary模板不会继续为每个属性、函数、类和异常生成单独的文档页面,并从摘要表中链接到它们。 It's possible to extend the templates to do this, as shown below, but I can't understand why this isn't the default behaviour - surely that's what most people would want..?可以扩展模板来做到这一点,如下所示,但我不明白为什么这不是默认行为 - 这肯定是大多数人想要的......? I've raised it as a feature request .我已将其作为功能请求提出

I had to copy the default templates locally, and then add to them:我不得不在本地复制默认模板,然后添加到它们中:

  • Copy site-packages/sphinx/ext/autosummary/templates/autosummary/module.rst to mytoolbox/doc/source/_templates/custom-module-template.rstsite-packages/sphinx/ext/autosummary/templates/autosummary/module.rstmytoolbox/doc/source/_templates/custom-module-template.rst
  • Copy site-packages/sphinx/ext/autosummary/templates/autosummary/class.rst to mytoolbox/doc/source/_templates/custom-class-template.rstsite-packages/sphinx/ext/autosummary/templates/autosummary/class.rstmytoolbox/doc/source/_templates/custom-class-template.rst

The hook into custom-module-template.rst is in index.rst above, using the :template: option. custom-module-template.rst的钩子在上面的index.rst ,使用:template:选项。 (Delete that line to see what happens using the default site-packages templates.) (删除该行以查看使用默认站点包模板会发生什么。)

custom-module-template.rst (additional lines noted on the right): custom-module-template.rst (右侧custom-module-template.rst附加行):

{{ fullname | escape | underline}}

.. automodule:: {{ fullname }}
  
   {% block attributes %}
   {% if attributes %}
   .. rubric:: Module Attributes

   .. autosummary::
      :toctree:                                          <-- add this line
   {% for item in attributes %}
      {{ item }}
   {%- endfor %}
   {% endif %}
   {% endblock %}

   {% block functions %}
   {% if functions %}
   .. rubric:: {{ _('Functions') }}

   .. autosummary::
      :toctree:                                          <-- add this line
   {% for item in functions %}
      {{ item }}
   {%- endfor %}
   {% endif %}
   {% endblock %}

   {% block classes %}
   {% if classes %}
   .. rubric:: {{ _('Classes') }}

   .. autosummary::
      :toctree:                                          <-- add this line
      :template: custom-class-template.rst               <-- add this line
   {% for item in classes %}
      {{ item }}
   {%- endfor %}
   {% endif %}
   {% endblock %}

   {% block exceptions %}
   {% if exceptions %}
   .. rubric:: {{ _('Exceptions') }}

   .. autosummary::
      :toctree:                                          <-- add this line
   {% for item in exceptions %}
      {{ item }}
   {%- endfor %}
   {% endif %}
   {% endblock %}

{% block modules %}
{% if modules %}
.. rubric:: Modules

.. autosummary::
   :toctree:
   :template: custom-module-template.rst                 <-- add this line
   :recursive:
{% for item in modules %}
   {{ item }}
{%- endfor %}
{% endif %}
{% endblock %}

custom-class-template.rst (additional lines noted on the right): custom-class-template.rst (右侧custom-class-template.rst附加行):

{{ fullname | escape | underline}}

.. currentmodule:: {{ module }}

.. autoclass:: {{ objname }}
   :members:                                    <-- add at least this line
   :show-inheritance:                           <-- plus I want to show inheritance...
   :inherited-members:                          <-- ...and inherited members too

   {% block methods %}
   .. automethod:: __init__

   {% if methods %}
   .. rubric:: {{ _('Methods') }}

   .. autosummary::
   {% for item in methods %}
      ~{{ name }}.{{ item }}
   {%- endfor %}
   {% endif %}
   {% endblock %}

   {% block attributes %}
   {% if attributes %}
   .. rubric:: {{ _('Attributes') }}

   .. autosummary::
   {% for item in attributes %}
      ~{{ name }}.{{ item }}
   {%- endfor %}
   {% endif %}
   {% endblock %}

I do not know whether Sphinx had had autosummary extension at the time original question was asked, but for now it is quite possible to set up automatic generation of that kind without using sphinx-apidoc or similar script.我不知道在提出原始问题时 Sphinx 是否有自动autosummary扩展,但现在很可能在不使用sphinx-apidoc或类似脚本的情况下设置这种自动生成。 Below there are settings which work for one of my projects.下面是适用于我的项目之一的设置。

  1. Enable autosummary extension (as well as autodoc ) in conf.py file and set its autosummary_generate option to True .conf.py文件中启用autosummary扩展(以及autodoc )并将其autosummary_generate选项设置为True This may be enough if you're not using custom *.rst templates.如果您不使用自定义*.rst模板,这可能就足够了。 Otherwise add your templates directory to exclude list, or autosummary will try to treat them as input files (which seems to be a bug).否则,将您的模板目录添加到排除列表中,否则autosummary会尝试将它们视为输入文件(这似乎是一个错误)。

     extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary'] autosummary_generate = True templates_path = [ '_templates' ] exclude_patterns = ['_build', '_templates']
  2. Use autosummary:: in TOC tree in your index.rst file.index.rst文件的 TOC 树中使用autosummary:: In this example documentation for modules project.module1 and project.module2 will be generated automatically and placed into _autosummary directory.在本示例中,模块project.module1project.module2文档将自动生成并放置到_autosummary目录中。

     PROJECT ======= .. toctree:: .. autosummary:: :toctree: _autosummary project.module1 project.module2
  3. By default autosummary will generate only very short summaries for modules and their functions.默认情况下, autosummary只会为模块及其功能生成非常短的摘要。 To change that you can put a custom template file into _templates/autosummary/module.rst (which will be parsed with Jinja2 ):要更改它,您可以将自定义模板文件放入_templates/autosummary/module.rst (将使用Jinja2解析):

     {{ fullname }} {{ underline }} .. automodule:: {{ fullname }} :members:

In conclusion, there is no need to keep _autosummary directory under version control.总之,没有必要将_autosummary目录置于版本控制之下。 Also, you may name it anything you want and place it anywhere in the source tree (putting it below _build will not work, though).此外,您可以将其命名为您想要的任何名称并将其放置在源代码树中的任何位置(尽管将其放在_build下方是_build )。

Sphinx AutoAPI正是这样做的。

In each package, the __init__.py file can have .. automodule:: package.module components for each part of the package.在每个包中, __init__.py文件可以为.. automodule:: package.module的每个部分包含.. automodule:: package.module组件。

Then you can .. automodule:: package and it mostly does what you want.然后你可以.. automodule:: package并且它主要做你想要的。

也许您正在寻找的是Epydoc和这个Sphinx 扩展

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM