Начало работы со Sphinx, когда ваши исходные файлы не находятся в базовой папке проекта - PullRequest
2 голосов
/ 31 января 2020

Хорошо, я боролся с Sphinx, не производящим никакой документации из строк документации, которые я написал в этом примере кода. Это простая реализация стека в Python.

Возможно, вам не нужно читать все это:

src/stack.py

class Stack:
    """Stack
    A simple implementation of a stack data structure in Python.

    """
    def __init__(self):
        self._data = []

    def push(self,item):
        """Push

        Push an item on to the stack.

        Args:
            arg: Item to be pushed to the top of the stack
        """
        self._data.append(item)

    def pop(self):
        """Pop

        Pop the top item off from the stack and return it.

        Returns:
            element: Item at the top of the stack.
        """
        item = self._data[-1]
        self._data = self._data[:-1]
        return item

    def pop_n(self,n):
        """Pop n elements

        Pops the top n elements from the stack.

        Parameters
        ----------
        arg1 : int
            Number of elements to be popped from the top of the stack

        Returns
        -------
        list
            A list of the top n elements popped from the stack
        """
        items = []
        for i in range(0,n):
            items.append(self.pop())
        return items

    def multipop(self):
        """Multipop

        Pops all the elements from the stack

        Returns
        -------
        list
            A list of every element in the stack
        """
        items = []
        while self.size() > 0:
            items.append(self.pop())
        return items

    def size(self):
        """Get Size

        Determine the size of the stack

        Returns
        -------
        int: A count of elements on the stack
        """
        return len(self._data)

conf.py

# sys.path.insert(0, os.path.abspath('../..')) # original path
sys.path.insert(0, os.path.abspath('../src')) # 2020-1-31 edited path

# ... A few inconsequential default settings and author information here ...
extensions = ['sphinx.ext.autodoc',
              'sphinx.ext.coverage',
              'sphinx.ext.napoleon'
             ]

stack.rst

stack module
============

.. automodule:: stack
    :members:
    :undoc-members:
    :show-inheritance:

Я пытался использовать Sphinx для документирования этого кода с помощью команды $ sphinx-autodoc -o docs/source src/. Это выводит файлы modules.rst, stack.rst. Затем я sphinx-build вывод в HTML из моего make-файла.

Мой вывод - заголовок на пустой странице: Модуль стека

как этот скриншот

Что-то automati c должно происходить здесь? Как получить какой-либо значимый вывод при использовании Sphinx autodo c?

2020-1-31 Обновление: у меня все еще есть некоторые проблемы с этим, поэтому я последовал советам Masklinn и создал Github репозиторий в дополнение к другому предложению об изменении пути, как уже упоминалось, но вывод документации по-прежнему неудовлетворителен.

2020-2-11 Обновление: структура файла, с которой я имею дело

.
├── docs
│   ├── build
│   │   ├── doctrees
│   │   │   ├── environment.pickle
│   │   │   ├── index.doctree
│   │   │   ├── modules.doctree
│   │   │   └── src.doctree
│   │   └── html
│   │       └── ... (misc html stuff)
│   ├── conf.py
│   ├── index.rst
│   ├── make.bat
│   ├── Makefile
│   ├── modules.rst
│   └── src.rst
├── Readme.md
└── src
    ├── __init__.py
    └── stack.py

Ответы [ 2 ]

3 голосов
/ 31 января 2020
sys.path.insert(0, os.path.abspath('../..'))

Это не правильно. Комментарий Стива Пирси не совсем точный (вам не нужно добавлять __init__.py, так как вы используете простой модуль), но они правы, что autodo c попытается импортировать модуль и затем проверить содержимое .

Если вы предполагаете, что ваше дерево равно

doc/conf.py
src/stack.py

, тогда вы просто добавляете папку, содержащую ваше хранилище, в sys.path, который совершенно бесполезен. Что вам нужно сделать, это добавить папку src в sys.path, чтобы при попытке sphinx импортировать stack он нашел ваш модуль. Таким образом, ваша строка должна быть:

sys.path.insert(0, os.path.abspath('../src')

(путь должен быть относительно conf.py).

Примечание: поскольку у вас есть что-то полностью синтетическое c и не должно содержать секретов, доступного репозитория или zip-файла всего этого, что значительно упрощает диагностику проблем и предоставляет соответствующую помощь: чем меньше нужно выводить, тем меньше ошибочен ответ.

2 голосов
/ 11 февраля 2020

Это обычный «канонический подход» к «началу работы», применяемый к случаю, когда ваш исходный код находится в каталоге src, например Project/src, а не просто в базовом каталоге Project.

Выполните следующие действия:

  1. Создайте каталог docs в своем каталоге Project (именно из этого каталога выполняются команды на следующих шагах ).

  2. sphinx-quickstart (выбирая отдельно source из build).

  3. sphinx-apidoc -o ./source ../src

  4. make html

Это даст следующую структуру (при условии, что .py исходные файлы находятся в Project/src):

Project
|
├───docs
│   │   make.bat
│   │   Makefile
│   │
│   ├───build
│   └───source
│       │   conf.py
│       │   index.rst
│       │   modules.rst
│       │   stack.rst
│       │
│       ├───_static
│       └───_templates
└───src
        stack.py

В вашем conf.py вы добавите (после шага 2):

import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join('..', '..', 'src')))

Также включите в conf.py:

extensions = ['sphinx.ext.autodoc', 'sphinx.ext.napoleon']

И в index.rst Вы бы связали modules.rst:

Welcome to Project's documentation!
================================

.. toctree::
   :maxdepth: 2
   :caption: Contents:

   modules


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

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

Ваши stack.rst и modules.rst были автоматически сгенерированы sphinx-apidoc, их не нужно менять (на данный момент). Но чтобы вы знали, вот как они выглядят:

stack.rst:

stack module
============

.. automodule:: stack
   :members:
   :undoc-members:
   :show-inheritance:

modules.rst:

src
===

.. toctree::
   :maxdepth: 4

   stack



После make html откройте Project/docs/build/index.html в вашем браузере, результаты:

enter image description here

и:

enter image description here

...