스핑크스 오토 독은 충분히 자동적이지 않다


149

Sphinx를 사용하여 Python에서 5,000 라인 이상의 프로젝트를 문서화하려고합니다. 약 7 개의 기본 모듈이 있습니다. 내가 아는 한 autodoc을 사용하려면 프로젝트의 각 파일에 대해 다음과 같은 코드를 작성해야합니다.

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

파일이 많기 때문에 너무 지루합니다. 'mods'패키지를 문서화하도록 지정하면 훨씬 쉬울 것입니다. 그러면 스핑크스는 재귀 적으로 패키지를 살펴보고 각 하위 모듈에 대한 페이지를 만들 수 있습니다.

이와 같은 기능이 있습니까? 그렇지 않으면 모든 .rst 파일을 만드는 스크립트를 작성할 수 있지만 시간이 많이 걸립니다.


"os.walk"를 사용하고이 모든 것을 쓰는 작은 스크립트를 작성하면 무엇이 문제입니까? BTW, 나는 40,000+ 라인 프로젝트를 가지고 있고 당신이 무슨 말을하는지 확실하지 않습니다. 몇 개의 파일이 관련되어 있습니까? ls파일 로 라우팅 하고 편집하는 것이 얼마나 어려운 가요?
S.Lott

125
아무도 어렵다고 말하지 않았다. OP는 지루 하다고 말했다 . 다른 문서 시스템이이를 수행 할 수 있다는 점을 고려할 때 이는 합리적이지 않습니다.
Gregg Lind

답변:


143

내가 만든 이 스크립트 를 확인할 수 있습니다 . 나는 그것이 당신을 도울 수 있다고 생각합니다.

이 스크립트는 Python 모듈 및 패키지를 찾는 디렉토리 트리를 구문 분석하고 Sphinx로 코드 문서를 작성하기 위해 ReST 파일을 적절하게 작성합니다. 또한 모듈 색인을 작성합니다.

최신 정보

이 스크립트는 이제 apidoc 로 Sphinx 1.1의 일부입니다 .


파일을 어디에 출력해야합니까? 스핑크스의 기본 _build 폴더로 출력을 시도했지만 실행 sphinx-build -b html . ./_build해도 선택되지 않습니다.
Cerin

source directory(. 귀하의 경우)에 넣어야합니다 . _build 디렉토리는 HTML 파일이 생성 될 위치입니다. 자세한 정보 확인 : sphinx.pocoo.org/tutorial.html#running-the-build
Etienne

1
@Erienne : 환상적인 스크립트! 내가 찾던 것. 개별 클래스에 대한 제목을 생성하기를 바랍니다 (일반적인 스핑크스 모양은 클래스에 좋지 않습니다. 더 큰 모듈에서는 길을 잃습니다)
jbenet

1
스핑크스 -apidoc조차도 아주 초보적입니다. 하나 또는 두 개의 모듈이있는 패키지의 경우 정상적으로 작동하지만 모듈이 깊게 중첩되어 있으며 sphinx-apidoc은 관리 할 수없는 출력을 생성합니다.
slacy

4
자기가 대답 : 추가 .. include:: modules.rst사용자에index.rst
치로 틸리郝海东冠状病六四事件法轮功

40

autosummary원래 질문을 받았을 때 Sphinx가 확장 기능을 사용 했는지 여부는 알 수 없지만 현재로서는 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::목차 트리에서 사용하십시오 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:

결론적으로 _autosummary디렉토리를 버전 제어 상태로 유지할 필요가 없습니다 . 또한 원하는 이름을 지정하고 소스 트리의 아무 곳에 나 배치 할 수 있습니다 (아래에 입력 _build해도 작동하지 않음).


4
이것은 큰 도움이되었습니다. "project.module1"및 "project.module2"가있는 지점 2에서 지정된 패키지의 모든 모듈에 대해 해당 목록을 자동으로 생성하는 방법이 있습니까? "프로젝트"를 넣고 "module1"과 "module2"를 스니핑하려면?
Brown

나는 어디서나 이것에 대한 답을 찾을 수 없다는 것에 놀랐다. @Brown을 해결 했습니까?
Alisdair Robertson

3
@AlisdairRobertson 아니요, 그러나 자동 요약 솔루션은 필자의 요구에 부응하는 것으로 끝났습니다. 내가 생각한 유일한 것은 index.rst 파일을 생성하고 모듈 이름을 자동 감지하는 스크립트를 작성하는 것입니다. 그러나 실제로 모듈 목록은 자주 변경되지 않으므로 한 번에 한 파일을 편집하는 것만으로는 무리가 없습니다. 하나의 파일을 편집하는 것보다 솔루션을 찾는 데 이미 많은 시간을 소비했다고 확신합니다!
Brown

12

각 패키지에서 __init__.py파일 .. automodule:: package.module에는 패키지의 각 부분에 대한 구성 요소 가있을 수 있습니다 .

그렇다면 당신은 할 수 .. automodule:: package있고 대부분 원하는 것을합니다.


init .py 에서 해당 문자열을 삼중 따옴표로 묶 습니까?
Cory Walker

5
@Cory Walker : "a"문자열이 아닙니다. 당신은 할 수 있습니다 - 그리고 해야한다 - 모든 하나의 파일에 트리플 인용 문서화 문자열을 넣어합니다. 여러분. 여기에는 __init__.py패키지 의 파일 이 포함 됩니다. docstring에는 .. automodule::패키지 내의 모듈을 포함하여 모든 Sphinx 설명서 지시문이 포함될 수 있습니다 .
S.Lott

2
autodoc오타 automodule입니다. 그러나 힌트를 주셔서 감사합니다!
mariotomo

9

스핑크스 버전 3.1 (2020 년 6 월)부터 sphinx.ext.autosummary(최종!) 재귀가 있습니다.

따라서 더 이상 자동 패키지 감지를 위해 모듈 이름을 하드 코딩하거나 Sphinx AutoAPI 또는 Sphinx AutoPackageSummary 와 같은 타사 라이브러리를 사용할 필요가 없습니다 .

문서화 할 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:

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템플릿은 각 속성, 함수, 클래스 및 예외에 대해 별도의 문서 페이지를 생성하지 않고 요약 테이블에서 해당 템플릿에 연결하지 않습니다. 아래와 같이 템플릿을 확장하여이 작업을 수행 할 수 있지만 이것이 기본 동작이 아닌 이유를 이해할 수 없습니다. 확실히 대부분의 사람들이 원하는 것입니다 ..? 기능 요청으로 제기했습니다 .

기본 템플릿을 로컬로 복사 한 다음 추가해야했습니다.

  • 복사 site-packages/sphinx/ext/autosummary/templates/autosummary/module.rstmytoolbox/doc/source/_templates/custom-module-template.rst
  • 복사 site-packages/sphinx/ext/autosummary/templates/autosummary/class.rstmytoolbox/doc/source/_templates/custom-class-template.rst

옵션을 사용하여 후크 custom-module-template.rstindex.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 %}

6

스핑크스 AutoAPI 는 정확하게 이것을 수행합니다.


1
맙소사! 이것은 다른 것보다 훨씬 잘 작동합니다. 이것은 "autodoc"또는 "apidoc"이 아니며, 완전히 다른 확장자입니다.
ropeladder

2
같게. "autodoc"이러한두고 "자동".... 여기에 우리의 프로젝트가 스위치에해야 할 일을했을 모든 : 스위치를 autoapi에 autodoc에서 nealmcb · 풀 요청 \ # 7 · gwexploratoryaudits / r2b2에 의해
nealmcb

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.