#python #python-sphinx
#python #python-sphinx #autodoc #sphinx-apidoc
Вопрос:
Я запускаю Sphinx в rst
файле, содержащем automodule
, но, похоже, он не оказывает никакого эффекта.
Вот подробности: у меня есть проект Python с файлом agent.py
, содержащим Agent
в нем класс. У меня также есть подкаталог apidoc
с файлом agent.rst
в нем (сгенерированный sphinx-apidoc
):
agent module
============
.. automodule:: agent
:members:
:undoc-members:
:show-inheritance:
Я запускаю sphinx sphinx-build -b html apidoc apidoc/_build
с каталогом проекта в качестве текущего рабочего каталога.
Чтобы убедиться, что файлы Python найдены, я включил следующее в apidoc/conf.py
:
import os
import sys
sys.path.insert(0, os.path.abspath('.'))
Он работает без ошибок, но когда я открываю результирующий HTML-файл, он показывает только «модуль агента», и все пусто. Почему он не показывает класс Agent
и его членов?
Обновление: первоначальная проблема, вероятно, была вызвана тем фактом, что я не включил sphinx.ext.autodoc
conf.py
. Однако теперь, когда я это сделал, я получаю предупреждения типа:
WARNING: invalid signature for automodule ('My Project.agent') WARNING: don't know which module to import for autodocumenting 'My Project.agent' (try placing a "module" or "currentmodule" directive in the document, or giving an explicit module name) WARNING: autodoc: failed to import module 'agent'; the following exception was raised: No module named 'agent'
Комментарии:
1. Ваш модуль должен быть в пакете Python. Поместите его в папку, которая также содержит
__init__.py
, и отрегулируйтеconf.py
и ваш reST по мере необходимости, например,mypackage.agent
.2. Я не знаю, в чем здесь проблема, но неверно, что модуль должен быть в пакете. Возможно иметь один
agent.py
модуль и нет__init__.py
.3. Действительно, это, похоже, не имело значения. Я добавил обновление к вопросу, пожалуйста, взгляните.
Ответ №1:
Я попытаюсь ответить, применив «канонический» подход бок о бок с вашим случаем.
Обычный «подход к началу работы» следует за этими шагами:
- создайте
doc
каталог в своемproject
каталоге (именно из этого каталога выполняются команды на следующих шагах). sphinx-quickstart
(выбираем отдельноsource
отbuild
).sphinx-apidoc -o ./source ..
make html
Это дало бы следующую структуру:
C:Project
|
| agent.py
|
|---docs
| | make.bat
| | Makefile
| |
| |---build
| |
| |---source
| | conf.py
| | agent.rst
| | index.rst
| | modules.rst
В вашем conf.py
вы бы добавили (после шага 2):
sys.path.insert(0, os.path.abspath(os.path.join('..', '..')))
и в index.rst
вы бы связали modules.rst
:
Welcome to Project's documentation!
================================
.. toctree::
:maxdepth: 2
:caption: Contents:
modules
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
Теперь сравните приведенное выше с тем, что у вас есть — из того, что вы поделили в своем вопросе:
C:Project
|
| agent.py
|
|---apidoc
| | agent.rst
| | conf.py
| |
| |-- _build
Вы запустили:
sphinx-build -b html apidoc apidoc/_build
и в вашем conf.py
:
sys.path.insert(0, os.path.abspath('.'))
Ваша ошибка stacktrace говорит, что не удалось найти модуль agent
. Вероятно, это потому, что вы не опустились на 1 уровень ниже в своем conf.py
(он указывает на путь с .rst
, а не на путь с .py
), это должно сработать:
sys.path.insert(0, os.path.abspath('..'))
. Кроме того, если вы не редактировали / не подключали свой вручную modules.rst
index.rst
, вы, скорее всего, увидите только этот модуль.
Возможно, вы захотите заметить подписи команд sphinx в игре:
sphinx-apidoc [OPTIONS] -o <OUTPUT_PATH> <MODULE_PATH>
sphinx-build [options] <sourcedir> <outputdir> [filenames …]
<sourcedir>
относится к where .rst
are и <MODULE_PATH>
к where .py
are . <OUTPUT_PATH>
куда .rst
помещаются и <outputdir>
куда .html
помещаются.
Пожалуйста, также обратите внимание, что вы упомянули: «каталог проекта в качестве текущего рабочего каталога». Я видел «рабочий каталог», упомянутый в потоках sphinx в stackoverflow, взаимозаменяемый как Project
базовый каталог, так и docs
каталог. Однако, если вы выполните поиск в документации Sphinx по «рабочему каталогу», вы не найдете упоминания об этом.
Наконец, есть преимущество в использовании структуры файлов / каталогов «подхода к началу работы». Это в основном «ставит вас на одну страницу» с большинством потоков в теге Sphinx, и таким образом облегчает умственную работу по сопоставлению обращений с различными структурами каталогов / файлов.
Надеюсь, это поможет.
Комментарии:
1. Спасибо, это очень полезно и хорошая ссылка для начала работы со Sphinx в целом! Проблема действительно была с sys.path. Я предполагал, что он должен ссылаться на каталог, из которого я выполнил sphinx (я делал это из каталога моего проекта), а не из корня документации (я все еще думаю, что ссылка на рабочий каталог процесса является более стандартным подходом, но ок).). Что касается index / modules, я добавил master_doc = ‘modules’ в conf.py , так что об этом позаботились.