工学と解析 / Sphinx チュートリアル

Sphinx で Python ドキュメントを自動生成する

water_potability プロジェクトの実ファイルを使って、コマンド3本で動かす

Python 3.x
Sphinx 9.x
sphinx-rtd-theme
water_potability プロジェクト
この記事の結論
analysis.py に書いた docstring を読ませるだけで、関数の説明・引数・戻り値・例外が整ったHTMLドキュメントになる。コマンドは3本。理屈は後でわかる。まず動かす。

1Sphinx とは

Sphinx は Python コードの中の docstring(説明文字列) を読み取って、HTML のドキュメントサイトを自動で組み立てるツールだ。

water_potability/analysis.py には load_data()evaluate_model() など11個の関数が書かれており、それぞれ :param::return: 付きの docstring がある。Sphinx はこれを読んで、引数テーブル・戻り値・例外一覧を含むHTMLページを自動生成する。自分でHTMLを一行も書く必要はない。

docstring とは

関数・クラス・モジュールの直後に書く三連引用符の文字列。analysis.pyload_data() 冒頭にある """ローカル CSV を読み込んで…""" がこれにあたる。Sphinx はこの文字列をドキュメントの原料にする。

2water_potability プロジェクトの構成

添付のファイル構造を整理すると、Sphinx に関係する部分は次のとおりだ。

water_potability_html/ ← プロジェクトルート(ここでコマンドを叩く)
.venv/ ← Sphinx 本体・コマンドはここ(触らない)
water_potability/ ← ドキュメントの「原料」(docstring を書く場所)
__init__.py
analysis.py ← 11関数すべてに docstring あり
main.py ← main() 関数に docstring あり
docs/
Makefile ← make html で使う
source/ ← Sphinx への「指示書」置き場
conf.py ← Sphinx の設定(Path設定・extensions・テーマ)
index.rst ← 目次のトップ(modules を参照)
modules.rst ← main.rst と analysis.rst を束ねる
analysis.rst ← water_potability.analysis を参照する命令
main.rst ← water_potability.main を参照する命令
build/html/ ← 完成したHTML(触らない・make html で生成される)
index.html / analysis.html / main.html …
data/ ← 分析データ(Sphinx とは無関係)
output/ ← 分析結果の出力先(Sphinx とは無関係)

3
手を動かす ― まずコマンドを3本叩く
INSTALL → QUICKSTART → conf.py 編集 → APIDOC → BUILD

この章はコピペで進める。理屈は4章以降に書いたので、まずここだけ読めばドキュメントが出来上がる。

3-1. インストール

プロジェクトルート(water_potability_html/)で実行する。

pip install sphinx sphinx-rtd-theme
uv を使う場合

uv add sphinx sphinx-rtd-theme で同じ結果が得られる。

3-2. quickstart ― docs フォルダを生成する

この手順は すでに docs/ フォルダがある場合はスキップ する。今回の water_potability プロジェクトには既に docs/ が存在しているので読み飛ばしてよい。新しくゼロから始める場合の参考として示す。

sphinx-quickstart docs

対話プロンプト ― こう答える

> Separate source and build directories? (y/n) y
> Project name: Water Potability Analysis
> Author name(s): Matsun
> Project release []: 0.1.0
> Project language [en]: ja

3-3. conf.py ― 実際のファイルをそのまま使う

今回のプロジェクトには docs/source/conf.py が既に用意されている。内容を確認しておこう。

docs/source/conf.py(実際のファイル)
import os, sys
from pathlib import Path

# ① パス設定 ─ Sphinx がコードをインポートできるようにする
ROOT = Path(__file__).resolve().parents[2]  # docs/source/ から2段上 = プロジェクトルート
sys.path.insert(0, str(ROOT))

# ② プロジェクト情報
project   = 'Water Potability Analysis'
copyright = '2026, Matsun'
author    = 'Matsun'
release   = '0.1.0'

# ③ 拡張機能 ─ 最重要
extensions = [
    'sphinx.ext.autodoc',    # docstring から自動でドキュメント生成
    'sphinx.ext.napoleon',   # Google/NumPy スタイルの docstring を解釈
    'sphinx.ext.viewcode',   # ソースコードへのリンクを追加
    'sphinx.ext.todo',       # TODO ディレクティブ
]

# ④ autodoc の設定
autodoc_default_options = {
    'members':        True,
    'member-order':   'bysource',  # ソース定義順に並べる
    'undoc-members':  False,       # docstring なしは除外
    'show-inheritance': True,
}

# ⑤ napoleon の設定
napoleon_google_docstring        = True
napoleon_numpy_docstring         = True
napoleon_use_admonition_for_notes = True

language   = 'ja'
html_theme = 'sphinx_rtd_theme'

3-4. sphinx-apidoc ― .rst スタブを自動生成する

今回も既に docs/source/analysis.rstmain.rstmodules.rst が存在する。docstring を修正した後や新しい関数を追加した際に 再実行して .rst を更新 する。

プロジェクトルートから実行する。最後の引数は ドキュメント化したいパッケージのパスだ。

sphinx-apidoc -f -o docs/source water_potability

実行後、docs/source/ の .rst が更新される。実際の中身は次のとおりだ。

docs/source/modules.rst
water_potability
================

.. toctree::
   :maxdepth: 4

   main
   analysis

docs/source/analysis.rst
analysis module
===============

.. automodule:: water_potability.analysis
   :members:
   :undoc-members:
   :show-inheritance:

index.rst の toctree も確認する

実際の index.rst では toctree に modules だけが書かれている。modules.rst がさらに mainanalysis を束ねる2段構成になっている。

# docs/source/index.rst の toctree(実際のファイル)
.. toctree::
   :maxdepth: 2
   :caption: Contents:

   modules  ← modules.rst を含める(modules.rst がさらに main/analysis を束ねる)

3-5. make html ― ビルドして確認する

docs/ フォルダに移動して make html を実行する。

terminal

cd docs
make html

# 成功すると:
# build succeeded.
# The HTML pages are in build/html.

ビルド後、docs/build/html/index.html をブラウザで開く。

# macOS
open docs/build/html/index.html

# Windows
start docs/build/html/index.html
✓ 完了

docs/build/html/analysis.html を開くと、load_data()evaluate_model() など11関数の説明が並んでいるはずだ。docstring を修正したら make html を再実行するだけで反映される。

📖

うまく動いた方は 4章 でファイル構造の意味を理解できる。エラーが出た方は 8章のエラー対処 を参照してほしい。


4
ファイル構造の意味
どのファイルが何をして、どこにつながるのか

情報は次の流れで一方通行に処理される。

原料 ── docstring を書く(唯一「自分で書く」場所)
water_potability/analysis.py ← ensure_output_dirs, load_data, plot_histograms など 11 関数
water_potability/main.py ← main() 関数

sphinx-apidoc -f -o docs/source water_potability

指示書 ── sphinx-apidoc が自動生成する(触らない)
docs/source/analysis.rst ←「water_potability.analysis の docstring を読め」という命令だけ書かれている
docs/source/main.rst ←「water_potability.main の docstring を読め」という命令
docs/source/modules.rst ← main と analysis を束ねる目次
docs/source/index.rst ← 全体の目次トップ(modules を参照)

cd docs && make html

製品 ── HTML が出力される(触らない)
docs/build/html/analysis.html ← analysis.py の全関数ドキュメント
docs/build/html/main.html ← main() のドキュメント
docs/build/html/index.html ← サイトのトップページ

build/ は触らない

docs/build/ の中身は make html のたびに上書きされる。編集するのは常に docs/source/ の .rst か、water_potability/ の .py の docstring だ。


5
conf.py の読み方
Path 設定・extensions・autodoc_default_options の意味

Path 設定 ― なぜ parents[2] なのか

今回の conf.py では os.path.abspath ではなく pathlib.Path を使っている。

ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT))

# Path(__file__) = docs/source/conf.py の絶対パス
# .parents[0] = docs/source/
# .parents[1] = docs/
# .parents[2] = water_potability_html/  ← プロジェクトルート
#
# sys.path に追加することで Python は
# water_potability/ パッケージを発見できるようになる

autodoc は .. automodule:: water_potability.analysis という命令を受けると、Python が実際に water_potability.analysis をインポートしてその docstring を取得する。パスが通っていないと ImportError になる。

extensions の各役割

sphinx.ext.autodoc

最重要
.py をインポートして docstring を HTML に変換する核心。.. automodule:: ディレクティブを解釈する。

sphinx.ext.napoleon

ほぼ必須
:param: 形式(RST スタイル)だけでなく、Google スタイル・NumPy スタイルも解釈できるようにする通訳。今回の analysis.py は RST スタイルを使っている。

sphinx.ext.viewcode

あると便利
ドキュメントページに「ソースを見る」リンクを追加する。docs/build/html/_modules/ にソースが保存される。

autodoc_default_options

挙動の制御
member-order: bysource でソース定義順(analysis.py の関数が上から順)に表示される。undoc-members: False で docstring のない関数は非表示になる。


6
.rst ファイルの仕組み
automodule 命令が何をしているのか / 2段構成の目次

今回のプロジェクトでは目次が 2段構成になっている。

index.rst
modules を参照
トップ

modules.rst
main と analysis を参照
束ね役

analysis.rst
automodule 命令
命令書

analysis.py
docstring を取得
原料

核心は .. automodule:: 命令だ。

docs/source/analysis.rst(実際のファイル)
analysis module
===============

.. この1行が核心。autodoc に「water_potability.analysis を
   Python としてインポートして、全メンバーの docstring を
   HTML に変換しろ」と指示する
.. automodule:: water_potability.analysis
   :members:
   :undoc-members:
   :show-inheritance:
.rst ファイルの立ち位置

.rst ファイルはコードを直接読まない。「autodoc にコードを読ませるための命令書」だ。sphinx-apidoc はこの命令書を自動生成するツール。自分でゼロから書く必要はない。


7
docstring の読み方
analysis.py の実際の docstring がどう HTML になるか

analysis.py は RST スタイル(:param::type::return::rtype::raises: を採用している。napoleon 拡張がなくても Sphinx 本来の書き方として認識される。

analysis.py の全関数一覧

11個の関数がすべて docstring を持ち、ドキュメントに反映される。

ensure_output_dirs(output_dir: Path) → None

output/figuresoutput/tables を作成する(存在する場合はスキップ)。

load_data(csv_path: Path) → pd.DataFrame

ローカル CSV を読み込んで DataFrame を返す。FileNotFoundErrorValueError を送出する可能性がある。

print_basic_info(df: pd.DataFrame) → None

head()shapeinfo() を標準出力に表示する。

summarize_missing_values(df, output_dir) → pd.DataFrame

欠損数と欠損率を集計し、tables/missing_values.csv に保存する。

summarize_target_ratio(df, output_dir) → pd.DataFrame

Potability のクラス比率を確認し、tables/target_ratio.csv に保存する。

plot_histograms(df, output_dir) → None

9特徴量のヒストグラム(40 bin・3列グリッド)を figures/histograms.png に保存する。

plot_boxplots_by_target(df, output_dir) → None

Potability(0/1)でグループ分けした箱ひげ図を figures/boxplots_by_target.png に保存する。

plot_correlation_matrix(df, output_dir) → None

全列のピアソン相関係数ヒートマップ(RdBu_r)を figures/correlation_matrix.png に保存する。

split_data(df: pd.DataFrame) → tuple[DataFrame, DataFrame, Series, Series]

層化抽出(stratify)で train/test に分割する。TEST_SIZE=0.2RANDOM_STATE=42(X_train, X_test, y_train, y_test) を返す。

build_baseline_pipeline() → Pipeline

中央値補完(SimpleImputer)→ 標準化(StandardScaler)→ ロジスティック回帰(max_iter=1000)の未学習パイプラインを返す。

evaluate_model(pipeline, X_test, y_test, output_dir) → dict[str, float]

Accuracy・F1・ROC-AUC を算出し、metrics.csvconfusion_matrix.csvclassification_report.csv に保存する。{'accuracy': …, 'f1': …, 'roc_auc': …} を返す。

docstring の実例 ― load_data()

実際の load_data() の docstring と、それが HTML でどう表示されるかを対応させて確認する。

water_potability/analysis.py — load_data の docstring(実際のコード)
def load_data(csv_path: Path) -> pd.DataFrame:
    """ローカル CSV を読み込んで DataFrame を返す。

    :param csv_path: 読み込む CSV ファイルのパス。
    :type csv_path: Path
    :return: 読み込んだデータ。
    :rtype: pd.DataFrame
    :raises FileNotFoundError: 指定されたファイルが存在しない場合。
    :raises ValueError: CSV の読み込みに失敗した場合。
    """
RST スタイルの各タグ

:param 名前: → 引数の説明
:type 名前: → 引数の型
:return: → 戻り値の説明
:rtype: → 戻り値の型
:raises 例外名: → 発生しうる例外

Sphinx はこれを解析して引数テーブル・戻り値・例外一覧を HTML に変換する。napoleon 拡張があれば Google/NumPy スタイルでも書ける。

定数もドキュメント化される

analysis.py の先頭には定数が定義されているが、docstring がないためデフォルト設定(undoc-members: False)では非表示になる。表示させたい場合は #: でコメントを付ける。

# 現在のコード(undoc-members: False なので非表示)
TARGET_COL   = "Potability"
RANDOM_STATE = 42
TEST_SIZE    = 0.2

# #: を付けると Sphinx が認識して表示される
TARGET_COL   = "Potability"  #: 目的変数のカラム名
RANDOM_STATE = 42             #: 乱数シード(再現性確保のため固定)
TEST_SIZE    = 0.2            #: テストデータの割合(全体の 20%)

8
エラー対処 ― うまくいかないときの自己診断
チェックリストで原因を特定し、エラー別に対処する

まず確認するチェックリスト

  • conf.pyROOT = Path(__file__).resolve().parents[2]water_potability_html/ を指しているか(parents[2] の数が正しいか)
  • docs/source/index.rst の toctree に modules が書いてあるか
  • docs/source/modules.rst の toctree に mainanalysis が書いてあるか
  • toctree のインデントが 半角スペース3個 になっているか(Tab・2個・4個はNG)
  • water_potability/__init__.py が存在するか(パッケージとして認識される必要がある)
  • 新しい関数を追加したあと sphinx-apidoc を再実行して .rst を更新したか

エラーメッセージ別対処


9まとめ

water_potability プロジェクトで Sphinx ドキュメントを作る ― 3本のコマンド
1
インストール pip install sphinx sphinx-rtd-theme
2
スタブ更新 sphinx-apidoc -f -o docs/source water_potability (conf.py・index.rst は既に用意済み)
3
ビルド cd docs && make html → docs/build/html/analysis.html に11関数のドキュメントが出力される

以降は analysis.py の docstring を書き直したら make html を再実行するだけだ。コードとドキュメントが常に同期した状態で維持できる。


コメントする