自作のSphinx拡張 sphinx-new-tab-link にいただいたissueに対応する中で知った小ネタです。
目次
Read the Docsのログを見ていて
:bug: extension fails with latest sphinx · Issue #11 · ftnext/sphinx-new-tab-link · GitHub中のログを見ていました。
自作拡張が原因で落ちている箇所を確認していたところ、ふとコマンドの行に目が止まります。
python -m sphinx -T -b html -d _build/doctrees -D language=en . $READTHEDOCS_OUTPUT/html
python -m sphinx
!
これは初めて見ました。
私はSphinxをquickstartすることが多く、生成されるMakefileのヘビーユーザです(make html
)。
この中ではsphinx-build
というコマンドを呼んでいる1という理解2なのですが、python -m sphinx
もあるなんて!
この2つ、違いは何なんでしょう?
私、気になります!
ソースコードを確認
結論を言うと、python -m sphinx
とsphinx-build
が呼び出す実装は同じです。
python -m sphinx
python -m
は、指定したパッケージの__main__.py
を実行できます。
https://docs.python.org/ja/3/library/__main__.html#main-py-in-python-packages
__main__.py
will be executed when the package itself is invoked directly from the command line using the -m flag.
Sphinxの__main__.py
はこちら
https://github.com/sphinx-doc/sphinx/blob/v7.2.6/sphinx/__main__.py
raise SystemExit(main(sys.argv[1:]))
sphinx.cmd.build.main
にsys.argv
を渡して実行しています(そうか、raise SystemExit
なんて書けるのか!)
sphinx.cmd.build.main
はこちら
https://github.com/sphinx-doc/sphinx/blob/v7.2.6/sphinx/cmd/build.py#L325
sphinx-build
コマンド
プロジェクトのメタデータを記載しているpyproject.tomlを見ます3。
https://github.com/sphinx-doc/sphinx/blob/v7.2.6/pyproject.toml#L105
[project.scripts] sphinx-build = "sphinx.cmd.build:main"
sphinx-build
コマンドの実体は、sphinx/cmd/build.pyのmain関数です。
python -m sphinx
で呼ばれる関数とおんなじだ!
終わりに
python -m sphinx
はsphinx-build
コマンドと同じでした。
以下の環境で、(usageの行を除いて)同じヘルプメッセージを確認できました。
2つある経緯が少し気になるところです。
リポジトリの中を探せば見つかるかな?
issue対応も頑張ります!(こんな情報量に満ちたissueをいただけただけで、もう感謝しかないんですが😭)