Автоматическое создание документации для всего содержимого пакета Python

Я пытаюсь автоматически сгенерировать базовую документацию для своей кодовой базы с помощью Sphinx. Однако у меня возникли трудности с указанием Sphinx рекурсивно сканировать мои файлы.

У меня есть кодовая база Python со структурой папок, например:

<workspace>
└── src
    └── mypackage
        ├── __init__.py
        │   
        ├── subpackageA
        │   ├── __init__.py
        │   ├── submoduleA1
        │   └── submoduleA2
        │   
        └── subpackageB
            ├── __init__.py
            ├── submoduleB1
            └── submoduleB2

Я запустил sphinx-quickstart в <workspace>, так что теперь моя структура выглядит так:

<workspace>
├── src
│   └── mypackage
│       ├── __init__.py
│       │
│       ├── subpackageA
│       │   ├── __init__.py
│       │   ├── submoduleA1
│       │   └── submoduleA2
│       │
│       └── subpackageB
│           ├── __init__.py
│           ├── submoduleB1
│           └── ubmoduleB2
│
├── index.rst
├── _build
├── _static
└── _templates  

Я прочитал краткое руководство, и хотя я m все еще пытается понять документацию, меня беспокоит то, как он сформулирован, что Sphinx предполагает, что я собираюсь вручную создавать файлы документации для каждого отдельного модуля / класса / функции в моей кодовой базе.

Тем не менее, я заметил оператор automdule и включил autodoc во время быстрого запуска, поэтому я надеюсь, что большая часть документации может быть сгенерирована автоматически. Я изменил свой conf.py, чтобы добавить мою папку src в sys.path, а затем изменил свой index.rst, чтобы использовать automdule. Итак, теперь мой index.rst выглядит так:

Contents:

.. toctree::
   :maxdepth: 2

Indices and tables
==================

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

.. automodule:: alphabuyer
   :members:

У меня есть десятки классов и функций, определенных в подпакетах. Но когда я бегу:

sphinx-build -b html . ./_build

он сообщает:

updating environment: 1 added, 0 changed, 0 removed

И, похоже, это не помогло импортировать что-либо в мой пакет. Просмотр сгенерированного index.html ничего не показывает рядом с Contents :. На странице указателя отображается только mypackage (модуль), но щелчок по нему показывает, что он также не имеет содержимого.

Как вы заставляете Sphinx рекурсивно анализировать пакет и автоматически генерировать документацию для каждого класса / метода / функции, с которыми он сталкивается, без необходимости вручную перечислять каждый класс самостоятельно?


person Cerin    schedule 06.01.2011    source источник


Ответы (4)


Возможно, apigen.py может помочь: https://github.com/nipy/nipy/tree/master/tools.

Этот инструмент очень кратко описан здесь: http://web.archive.org/web/20150327063758/http://comments.gmane.org:80/gmane.comp.python.sphinx.devel/2912.

Или еще лучше используйте pdoc.


Обновление: в Sphinx версия 1.1.

person mzjn    schedule 06.01.2011
comment
Это больше похоже на запоздалую мысль о каком-то совершенно не связанном с этим проекте. Нет даже документации по использованию самого инструмента. - person Cerin; 06.01.2011
comment
Невозможно делать то, что вы хотите, только с ванильным Sphinx. Требуется нечто большее, и apigen.py - хороший кандидат. Почему это имеет значение, если это не связано с ним или о нем думают позже? Инструмент не аккуратно упакован и не тщательно документирован, но и не слишком сложен. Начните с адаптации короткого основного скрипта build_modref_templates.py. Этот скрипт импортирует класс ApiDocWriter из apigen.py, который выполняет всю тяжелую работу. - person mzjn; 07.01.2011
comment
Меня беспокоит, что это запоздалая мысль, потому что, поскольку это дополнение к библиотеке нейровизуализации, разработчик сосредоточится на нейровизуализации, а не на том, чтобы apigen.py работал для широкой публики. Однако ваша точка зрения о том, что Sphinx не поддерживает этот тип автоматизации, хорошо воспринята. В итоге я выбрал bitbucket.org/etienned/sphinx-autopackage-script, который посвящен этой задаче, хотя я уверен, что apigen.py, вероятно, также подойдет. - person Cerin; 10.01.2011

Вы можете попробовать использовать sphinx-apidoc.

$ sphinx-apidoc --help
Usage: sphinx-apidoc [options] -o <output_path> <module_path> [exclude_paths, ...]

Look recursively in <module_path> for Python modules and packages and create
one reST file with automodule directives per package in the <output_path>.

Вы можете смешать sphinx-apidoc с sphinx-quickstart, чтобы создать весь проект документа следующим образом:

$ sphinx-apidoc -F -o docs project

Этот вызов сгенерирует полный проект со sphinx-quickstart и рекурсивно искать в (проекте) модули Python.

Надеюсь это поможет!

person Daniel    schedule 10.11.2011
comment
Команда apidoc не создает файл index.rst ... Я что-то упустил? - person guilhermecgs; 29.01.2018
comment
@guilhermecgs index.rst и modules.rst обычно генерируются с использованием sphinx-quickstart перед использованием sphinx-apidoc. Вы можете сгенерировать эти файлы, используя только sphinx-apidoc, используя _ 6_ или -full флаги. - person bad_coder; 27.04.2020

Примечание

Чтобы Sphinx (фактически, интерпретатор Python, который запускает Sphinx) мог найти ваш модуль, он должен быть импортируемым. Это означает, что модуль или пакет должны находиться в одном из каталогов на sys.path - соответственно измените sys.path в файле конфигурации.

Итак, зайдите в свой conf.py и добавьте

import an_example_pypi_project.useful_1
import an_example_pypi_project.useful_2

Теперь ваш index.rst выглядит так:

.. toctree::
   :glob:

   example
   an_example_pypi_project/*

а также

make html

person macm    schedule 22.08.2013

Начиная с Sphinx версии 3.1 (июнь 2020 г.), если вы счастливы использовать sphinx.ext.autosummary для отображения сводных таблиц, вы можете использовать новую опцию :recursive: для автоматического обнаружения каждого модуля в вашем пакете, даже если он глубоко вложен, и автоматического создания документации для каждого атрибута, класс, функция и исключение в этом модуле.

См. Мой ответ здесь: https://stackoverflow.com/a/62613202/12014259

person James Leedham    schedule 29.06.2020