nikkie-ftnextの日記

イベントレポートや読書メモを発信

uvx(やpipx)により、Python製CLIツールも開発者による仮想環境管理が不要になってるじゃん! Sphinxを例に

はじめに

えびふりゃー・みそかつ・小倉トースト・みゃ〜 nikkieです

inline script metadata(PEP 723)により、Pythonスクリプトについては開発者が仮想環境を管理しなくてもよくなっています1🙌
さらにこのたびuvxによってPythonCLIツールも開発者が仮想環境を管理しなくてよい世界になっていることに気づきました!

目次

これまでの私

仮想環境にドキュメンテーションツール Sphinxや使いたいSphinx拡張をインストールしていました。

$ python -m venv .venv --upgrade-deps
$ .venv/bin/python -m pip install Sphinx sphinx-new-tab-link

uvxによって、この仮想環境構築も開発者がやらなくてよくなっていると体感しました。
ツールにお任せできます!

uvx

docs.astral.sh

--fromでパッケージを指定

uvxuvx <コマンド>という書式です。
uvx ruff formatでuvが管理する仮想環境にRuffをインストールし、ruff formatを実行します2

パッケージ名とコマンドが異なる場合もあります。
ドキュメントの例はhttpieパッケージhttpコマンド
https://docs.astral.sh/uv/guides/tools/#commands-with-different-package-names
このときはuvx --from httpie http--fromで指定します。
uvx ruff formatuvx --from ruff ruff formatという理解です

Sphinxの場合ですが、sphinx-quickstartコマンド3--fromを使って動かせます。

uvx --from Sphinx sphinx-quickstart \
  -q \
  -p 2023_slides \
  -a nikkie \
  -v '' \
  -l ja \
  --sep \
  --no-batchfile \
  --no-makefile \
  --ext-githubpages \
  --extensions sphinx_new_tab_link \
  --extensions sphinx_design

sourceディレクトリとbuildディレクトリができます)

--withで一緒に使うパッケージを指定

Sphinx合わせて使いたい拡張は--withで指定します。
https://docs.astral.sh/uv/guides/tools/#commands-with-plugins
これができるのはとてもありがたいですね

uvx --from Sphinx \
  --with sphinx-new-tab-link \
  --with sphinx-design \
  sphinx-build -M html source build

HTMLページはbuild/htmlにあります。

コマンドは長くなりますが、Makefileなどに書いておけば気にならないかなと考えています4
むしろ、uvさえ入っていれば、他の開発者の手元でも動くことが期待される点を私は高く評価しています(開発者が仮想環境を触らなくてよいので)

pipxの場合

--spec

uvx --fromと同じ動きはできますね。
ドキュメント「Package with multiple apps, or the app name doesn't match the package name

pipx run --spec Sphinx sphinx-quickstart \
  -q \
  -p 2023_slides \
  -a nikkie \
  -v '' \
  -l ja \
  --sep \
  --no-batchfile \
  --no-makefile \
  --ext-githubpages \
  --extensions sphinx_new_tab_link \
  --extensions sphinx_design

sourceディレクトリとbuildディレクトリができます)

一方uvx --withと同様の機能は、pipxでは未サポートのように思われました(めちゃ便利だと思うので、プルリクチャンス!)
https://pipx.pypa.io/stable/docs/#pipx-run

終わりに

uvx--from--withにより、Sphinxやそれらの拡張を仮想環境に開発者がインストールする一手間が完全に不要になっていることに気づきました。
inline script metadataサポート、そしてuvxと、開発者が仮想環境を触る必要性をuvが奪っていっているのがなかなかよいアプローチではないかと思います。
一方、私は仮想環境を理解しているので歓迎しているのですが、uvから入った方に仮想環境をどう伝えていくかは難しいかもとも思います(仮想環境を理解していないとuvにロックインされちゃうかな)

uvx runpipx run相当5で、開発者が仮想環境管理から解放され常に最新のパッケージを利用できると私は考えているので、uvx--from--withが可能にする世界を両手を上げて歓迎しています。
いよいよuvx runソースコードに潜って、思い違いをしていないか確認するときが来たように思われます。

P.S. One more thing...

このエントリで1日1エントリは730日連続となりました。
2周年(365 * 2)、うおおおおおお!!🎉

はじまりのエントリと同じSphinxネタだよ...


  1. PyCon JP 2024で話してきました
  2. Ruffの参考
  3. コマンドはこちらの記事から(「今後はこんな感じのコマンドを使っていこう」を更新)
  4. Makefileの例:https://github.com/ftnext/first-python-test-2024/blob/080527ebca171a1ac71e305923a1cef515cd23d1/Makefile
  5. pipx runは利点があまりに多くてヤバい!