Pythonスキルの習得

Sphinxを用いた、Pythonドキュメントの自動生成

Sphinxを用いた、Pythonドキュメントの自動生成
by AIイラスト

こんにちは、Zero-Cheeseです。

プロジェクトのドキュメント制作、面倒ではありませんか?

本記事では、Python初級者以上を対象に、ドキュメント自動生成ツール「Sphinx」の使用方法を、詳しく解説します。

ドキュメント自動生成には、Docstringの記述が必要です。

Docstringの記述方法に慣れていない方は、近日中に公開予定の関連記事を、本ブログでチェックしてみてください。

Pythonのドキュメントを、自動生成する方法

Sphinxのインストール方法

Sphinxは、pipを使用して、簡単にインストールできます。

pip install sphinx

プロジェクトのセットアップ

ドキュメント生成の準備として、Sphinx用の、「専用フォルダ」を作成します。

プロジェクトのルートディレクトリが乱雑にならないよう、ドキュメント関係は、当フォルダに全て格納します。

フォルダ作成と移動は、以下のコマンドで行います。(カレントディレクトリ:ルートの場合)

mkdir docs
cd docs

次に、Sphinxの初期セットアップを行います。

sphinx-quickstart

セットアップ時、以下の質問があります。

(例:)

Project name: sphinx
Author name(s): 2023, Nanashi
Project release []: [0.0.1] ⇦ リリースバージョンを指定
Project language [en]: [ja]

conf.pyの編集

conf.pyはSphinxの設定ファイルで、sphinx-quickstartを実行することで、自動生成されます。

基本設定

docs/source ディレクトリに移動して、conf.pyを編集、必要な拡張モジュールを追加します。

extensions = ['sphinx.ext.autodoc']

上記の拡張モジュールを設定する事で、Sphinxは、Pythonのソースコードからドキュメンテーションを、直接生成できます。

さらに、Pythonファイルの場所を、適切に指定します。

Pythonファイルがルートディレクトリにある場合は、以下のように編集します。

(conf.py の最上段に、下記コードを追記します。)

import os
import sys

# ルートディレクトリをパスに追加
# この操作にて、ルートディレクトリ直下にある、〇〇.pyが読み込まれます。
sys.path.extend([
    os.path.abspath('../..'),           # ルートディレクトリ
])

上記の設定により、

  • ルートディレクトリや、そのサブフォルダ内のPythonファイルが

「Sphinx」によって、探索されます。

新しいモジュールを追加した場合の、ドキュメント生成方法

例として、「new_module.py」の、ドキュメント生成方法を説明します。

new_module.py」には、下記内容が、含まれているとします。

def example_function():
    """This function does something."""
    pass

class ExampleClass:
    """This class represents an example."""

    def method_in_class(self):
        """This method does something inside the class."""
        pass

ドキュメントを生成するため、

  • docs/sourceディレクトリ内に、new_module.rstという新しいファイルを作成し、

下記内容を、追加します。

New Module
==========

.. automodule:: new_module
   :members:

:members: オプションを使用することで、new_module.py 内の全ての関数やクラスが、ドキュメントに取り込まれます。

Sphinxのエントリーポイント、index.rstの編集

index.rstは、Sphinx-quickstartを実行することで、docs/sourceディレクトリ下に、自動生成されるファイルです。

new_moduleを追加することで、new_module.rstへのリンクが作成されます。

(追加点は、 15行目の、new_module です。)

.. sphinx documentation master file, created by
   sphinx-quickstart on Sun Aug  6 13:54:05 2023.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

Welcome to My Project's Documentation!
==================================

This is the main documentation for My Project. 

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

   new_module


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

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

要点

  1. ヘッダー (...====) はドキュメントのタイトルを示しています。この場合:”My Project Documentation”
  2. タイトルの下にはドキュメントの概要や説明を、記述します。
  3. .. toctree:: ディレクティブは、他のドキュメントへのリンクリストを生成するためのものです。(この例ではnew_moduleというリンクを追加する事で、new_module.rstファイルへのリンクが生成)
  4. Indices and tablesセクションは、ドキュメント内の特殊な索引ページや、モジュールの索引ページ、検索ページへのリンクです。
    • :ref:genindex“: 一般的な索引ページへのリンク。
    • :ref:modindex“: Pythonモジュールの索引ページへのリンク。
    • :ref:search“: ドキュメント内での検索ページへのリンク。

ドキュメントの生成

ビルドの実行

docsディレクトリ上で、下記コマンドにて、ビルドします。

make html
  • ビルドが成功すると、./docs/buildフォルダ下に、ファイル群が生成されます。
  • ./docs/build/html/index.htmlをブラウザで開くと、下図のように、生成されたドキュメントを、確認できます。

new_moduleへのリンクを「indices and tables」セクションに追加したい場合:

以下のようにindex.rstを編集します:

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

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
* :doc:`new_module`

上記コードを実行結果:

(New_moduleリンクが、追加されている事が、確認できます。)

クライアントにドキュメントを提供する場合、docs/build/htmlディレクトリを、共有します。

docs/build/doctreesディレクトリは、Sphinxがドキュメントをビルドする過程で作られる、中間ファイルです。

無視して問題ありません。

中級者向け:多層フォルダ構造での.rstファイル自動生成方法 

中規模以上のソフトウェア開発では、フォルダが多層構造が一般的です。

それぞれのフォルダに手動で.rstファイルを作成し、index.rst に追加するのは、非効率です。

このセクションでは、その作業を自動化する方法について、解説します。

フォルダ構成例

本章では、実務で使用する「フォルダ構成」を例に、自動生成する方法をご紹介します。

例えば、ドメイン駆動開発の場合、以下のようなフォルダ構造を取ることがあります。

project_root/
|-- docs/
|   |-- (ドキュメント関連のファイルやディレクトリ...)
|-- domain/
|   |-- __init__.py
|   |-- models/
|       |-- __init__.py
|       |-- user.py
|       |-- product.py
|   |-- services/
|       |-- __init__.py
|       |-- user_service.py
|-- application/
|   |-- __init__.py
|   |-- services/
|       |-- __init__.py
|       |-- user_application_service.py
|-- infrastructure/
|   |-- __init__.py
|   |-- orm_models.py
|   |-- repository.py
|-- interfaces/
|   |-- __init__.py
|   |-- web/
|       |-- __init__.py
|       |-- controllers/
|           |-- __init__.py
|           |-- user_controller.py
|       |-- views/
|           |-- __init__.py
|       |-- static/
|-- tests/

sphinx-apidocは、__init__.pyが含まれるフォルダ(つまり、Pythonのモジュールとして認識されるフォルダ)を、ドキュメントの生成対象として認識します。

したがって、各ディレクトリに__init__.pyが、必要です。

sphinx-apidocの使い方

sphinx-apidocの利用

sphinx-apidocは、Pythonのコードからドキュメントを自動生成するためのSphinxのツールです。

(Sphinxをインストールしたら、併せて当ツールもインストールされます。)

具体的には、Pythonのディレクトリ・ファイル構造に基づいて、.rstファイルを生成します。

sphinx-apidocの使い方は、以下の通りです。

sphinx-apidoc -o [OUTPUT_PATH] [MODULE_PATH]
  • [OUTPUT_PATH]: .rst ファイルの出力先。
  • [MODULE_PATH]: ドキュメント化するPythonモジュールやパッケージのパス。
  • -f オプションにて、既存の .rstファイルを上書きできます。

具体例として、カレントディレクトリが「./docs」の場合、下記コマンドとなります。

sphinx-apidoc -o source/ ../

ドキュメントの出力

上記コマンドを実行すると、必要なファイル群が docs/source ディレクトリ内に、自動生成されます。

また、自動生成された .rst ファイルには、適切な toctree が含まれています。

生成例:

.. toctree::
   :maxdepth: 2

   domain/index
   application/services/user_application_service
   infrastructure/orm_models
   interfaces/web/controllers/user_controller

コードの解説:

maxdepth: 2 の設定では、toctreeディレクティブに、直接記載された各ページを基点として、そのページから2階層深い「サブページ」までのリンクを表示します。

つまり、直接リストされているページ(例:domain/indexapplication/services/user_application_service)は、その階層に関係なく、リンクリストに表示されます。

sphinx-apidoc が出力する内容は、Pythonのモジュールとパッケージのみです。

つまり、特定のディレクトリ構造や、Python外コードのドキュメントを自動で toctree に組み込む場合、追加のスクリプトやカスタマイズが、必要になる場合があります。

index.rstファイルの改廃

トップページである「index.rst」は、自動更新されません。

手動での編集が必要です。

例として、各サブフォルダへのリンクを貼りたい場合、下記のように編集します。

10〜13行目が、追加点となります。)

Welcome to My Project's Documentation!
==================================

This is the main documentation for My Project.

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

   domain
   application
   infrastructures
   interfaces



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

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

conf.pyの編集

多層ディレクトリ構造の場合、conf.pyを編集して、Sphinxが適切にモジュールを探索できるように、設定する必要があります。

import os 
import sys

root_path = os.path.abspath('../..') # ルートディレクトリをsys.pathに追加 
sys.path.append(root_path) # ルートディレクトリ以下のすべてのサブディレクトリをsys.pathに追加 
for dirpath, dirnames, filenames in os.walk(root_path): 
    sys.path.append(dirpath)

HTML出力

ドキュメントの生成が完了したら、以下のコマンドを実行して、HTML形式で出力します。

cd docs
make html

生成されたHTMLファイルは、docs/build/html ディレクトリに、格納されます。

さいごに

現代の開発環境では、頻繁なコード変更に伴い、sphinxのような自動ドキュメント生成ツールが非常に役立っています。

(クライアントによっては、きちんとしたドキュメントを生成する必要がありますが、その場合でも、Sphinxによる自動生成は、活用できます。)

また、Docstringの適切な書き方に関する記事も、近日中に公開予定します!

公開しました。

Python初心者から中級者まで! コメントとDocstringの書き方を マスターしよう
Python初心者から中級者まで! コメントとDocstringの書き方をマスターしようPythonコードのドキュメンテーションとコメントのベストプラクティスについて詳しく解説します。一般的なコメントの書き方から、Sphinxスタイル、GoogleスタイルやNumpyスタイルのdocstringの書き方まで、徹底的に解説しました。...

本記事も、最後までお付き合いいただき、ありがとうございました

それではまた、お会いしましょう!