Sphinx autodoc不够自动化

时间:2010-04-23 21:11:54

标签: python python-sphinx

我正在尝试使用Sphinx在Python中记录5,000多行项目。它有大约7个基本模块。据我所知,为了使用autodoc,我需要为我项目中的每个文件编写这样的代码:

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

这太繁琐了,因为我有很多文件。如果我能指定我想要记录'mods'包,那将会容易得多。然后,Sphinx可以递归地遍历包并为每个子模块创建一个页面。

有这样的功能吗?如果没有,我可以写一个脚本来制作所有.rst文件,但这会花费很多时间。

6 个答案:

答案 0 :(得分:127)

您可以查看我制作的script。我认为它可以帮助你。

此脚本解析目录树以查找python模块和包,并相应地创建ReST文件以使用Sphinx创建代码文档。它还创建了一个模块索引。

<强>更新

此脚本现在是 apidoc 的Sphinx 1.1的一部分。

答案 1 :(得分:31)

我不知道Sphinx在询问原始问题时是否有autosummary扩展名,但是现在很有可能在不使用sphinx-apidoc或类似脚本的情况下设置这种类型的自动生成。下面有一些设置适用于我的一个项目。

  1. autosummary文件中启用autodoc扩展名(以及conf.py),并将其autosummary_generate选项设置为True。如果您不使用自定义*.rst模板,这可能就足够了。否则,将模板目录添加到排除列表,或autosummary将尝试将它们视为输入文件(这似乎是一个错误)。

    extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary']
    autosummary_generate = True
    templates_path = [ '_templates' ]
    exclude_patterns = ['_build', '_templates']
    
  2. autosummary::文件的TOC树中使用index.rst。在此示例中,模块project.module1project.module2的文档将自动生成并放入_autosummary目录。

    PROJECT
    =======
    
    .. toctree::
    
    .. autosummary::
       :toctree: _autosummary
    
       project.module1
       project.module2
    
  3. 默认情况下,autosummary只会为模块及其功能生成非常简短的摘要。要更改它,您可以将自定义模板文件放入_templates/autosummary/module.rst(将使用Jinja2解析):

    {{ fullname }}
    {{ underline }}
    
    .. automodule:: {{ fullname }}
        :members:
    
  4. 总之,没有必要将_autosummary目录保留在版本控制之下。此外,您可以将其命名为任何名称并将其放置在源树中的任何位置(将_build放在{{1}}下方不起作用)。

答案 2 :(得分:28)

从Sphinx 3.1版(2020年6月)开始,sphinx.ext.autosummary(最终!)具有递归功能。

因此不再需要对模块名称进行硬编码或依靠Sphinx AutoAPISphinx AutoPackageSummary之类的第三方库来进行自动程序包检测。

示例Python 3.7包以文档(see code on Githubresult on 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

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(请注意新的:recursive:选项):

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

Some words.

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

   mypackage

这足以自动总结软件包中的每个模块,无论它们嵌套如何。然后,对于每个模块,它汇总该模块中的每个属性,函数,类和异常。

不过,奇怪的是,默认的sphinx.ext.autosummary模板不会继续为每个属性,函数,类和异常生成单独的文档页面,并从摘要表链接到它们。可以扩展模板来执行此操作,如下所示,但是我不明白为什么这不是默认行为-当然这是大多数人想要的。 I've raised it as a feature request

我必须在本地复制默认模板,然后将其添加到其中:

  • site-packages/sphinx/ext/autosummary/templates/autosummary/module.rst复制到mytoolbox/doc/source/_templates/custom-module-template.rst
  • site-packages/sphinx/ext/autosummary/templates/autosummary/class.rst复制到mytoolbox/doc/source/_templates/custom-class-template.rst

使用custom-module-template.rst选项,钩住index.rst在上方:template:中。 (删除该行,以查看使用默认站点包模板会发生什么。)

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(其他行在右侧注明):

{{ 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 %}

答案 3 :(得分:11)

在每个包中,__init__.py文件可以包含每个部分的.. automodule:: package.module个组件。

然后你可以.. automodule:: package,它主要做你想要的。

答案 4 :(得分:1)

也许你要找的是EpydocSphinx extension

答案 5 :(得分:1)

Sphinx AutoAPI正是这样做的。