debug_sphinx_build プログラム仕様
Sphinx autodocにおけるimportエラーを調査するためのユーティリティスクリプト。
各 .py ファイルを subprocess で個別 import することで、 Qt/Tk/matplotlib backend などの副作用が後続ファイルに残らないようにする。
debug_sphinx_build.py 技術ドキュメント
- class sphinx_.debug_sphinx_build.DummyModule(name, doc=None)
ベースクラス:
ModuleTypeモックモジュールとして振る舞うダミークラス。
types.ModuleType を継承し、未定義の属性にアクセスされた際に DummyObject を動的に作成・設定する。
- class sphinx_.debug_sphinx_build.DummyObject(name: str = 'dummy')
ベースクラス:
objectモックオブジェクトとして振る舞うダミークラス。
属性アクセスや関数呼び出しがあってもエラーにならず、常に新しい DummyObject を返す。 これにより、実際のモジュールが存在しなくても参照エラーを防ぐ。
- sphinx_.debug_sphinx_build.add_sys_paths(args, source_dir: Path) None
コマンドライン引数に基づいて sys.path にパスを追加する。
args.add_cwd が真ならカレントディレクトリを、args.add_source が真なら ソースディレクトリを sys.path の先頭に追加する。 すでにパスが存在する場合は追加しない。
- パラメータ:
args (argparse.Namespace) -- コマンドライン引数を格納する名前空間オブジェクト。
source_dir (Path) -- Sphinxのソースディレクトリのパス。
- 戻り値:
None
- 戻り値の型:
None
- sphinx_.debug_sphinx_build.child_import_one_file(args) None
子プロセスとして単一のPythonファイルをインポートする。
sys.path の設定、手動モック、conf.py 由来のモックを適用した後、 指定されたファイルをモジュールとしてロードする。 この関数は、--child-import 引数が指定された場合にメイン関数から呼び出される。
- パラメータ:
args (argparse.Namespace) -- コマンドライン引数を格納する名前空間オブジェクト。
- 戻り値:
None
- 戻り値の型:
None
- sphinx_.debug_sphinx_build.install_mock_modules(module_names: list[str]) None
指定されたモジュール名を sys.modules にダミーモジュールとしてインストールする。
モジュール名が階層的(例: numpy.linalg)である場合、親モジュール (numpy) も ダミーモジュールとして追加される。
- sphinx_.debug_sphinx_build.load_conf_mocks(source_dir: Path) list[str]
conf.py から autodoc_mock_imports の設定を読み込む。
conf.py が存在しない場合は空のリストを返す。 autodoc_mock_imports がリストまたはタプルでない場合は警告を表示し、空リストを返す。
- sphinx_.debug_sphinx_build.load_module_from_file(module_name: str, file_path: Path)
指定されたファイルパスからモジュールをロードし、sys.modules に追加する。
importlib.util を使用してモジュール仕様を作成し、ロードして実行する。
- パラメータ:
module_name (str) -- ロードするモジュールの名前。
file_path (Path) -- ロードするモジュールのファイルパス。
- 戻り値:
ロードされたモジュールオブジェクト。
- 戻り値の型:
- 例外:
ImportError -- モジュール仕様の作成に失敗した場合。
- sphinx_.debug_sphinx_build.main()
スクリプトのメインエントリポイント。
コマンドライン引数を解析し、親プロセスとして動作する場合は source ディレクトリ内の すべてのPythonファイルを子プロセスで順次インポートを試みる。 子プロセスとして動作する場合は、単一のファイルをインポートする (--child-import 指定時)。 エラーが発生した場合は記録し、最終的に概要を出力する。
- sphinx_.debug_sphinx_build.make_module_name(source_dir: Path, py_file: Path) str
ソースディレクトリとPythonファイルのパスから、一意なモジュール名を生成する。
ファイルパスをソースディレクトリからの相対パスに変換し、ファイル名をハイフンやスペースを アンダースコアに置換して、有効なPython識別子になるように調整する。 sphinx_debug. プレフィックスを付与する。
- パラメータ:
source_dir (Path) -- Sphinxのソースディレクトリのパス。
py_file (Path) -- 対象のPythonファイルのパス。
- 戻り値:
生成されたモジュール名。
- 戻り値の型:
- sphinx_.debug_sphinx_build.parse_mock_arg(mock_text: str) list[str]
セミコロン区切りの文字列からモックモジュール名のリストを解析する。
空白文字列や空の要素は無視される。
- sphinx_.debug_sphinx_build.print_error_summary(errors: list[dict]) None
記録されたエラーの概要をコンソールに出力する。
エラーがない場合はその旨を表示する。
- sphinx_.debug_sphinx_build.raise_if_subprocess_failed(cp: CompletedProcess, py_file: Path) None
サブプロセスが非ゼロの終了コードを返した場合に RuntimeError を発生させる。
- パラメータ:
cp (subprocess.CompletedProcess) -- サブプロセスの実行結果を含む subprocess.CompletedProcess オブジェクト。
py_file (Path) -- サブプロセスで処理されたファイルのパス。
- 戻り値:
None
- 戻り値の型:
None
- 例外:
RuntimeError -- サブプロセスが失敗した場合。
- sphinx_.debug_sphinx_build.record_error(errors: list[dict], phase: str, file_path: Path, exc: BaseException, stdout: str = '', stderr: str = '') None
発生したエラー情報を記録リストに追加する。
エラーのフェーズ、ファイルパス、例外情報、標準出力、標準エラー出力などを 辞書形式で記録する。
- sphinx_.debug_sphinx_build.run_import_in_subprocess(args, source_dir: Path, py_file: Path) CompletedProcess
指定されたPythonファイルを子プロセスでインポート実行する。
現在のスクリプト自体を python -m のように --child-import オプションを付けて実行し、 指定されたファイルのみをインポートさせる。 子プロセスの標準出力と標準エラー出力をキャプチャする。
- パラメータ:
args (argparse.Namespace) -- コマンドライン引数を格納する名前空間オブジェクト。
source_dir (Path) -- Sphinxのソースディレクトリのパス。
py_file (Path) -- インポートするPythonファイルのパス。
- 戻り値:
サブプロセスの実行結果を含む subprocess.CompletedProcess オブジェクト。
- 戻り値の型: