uvでPythonのCLIツールを作成・インストール・実行
Pythonのパッケージ・プロジェクトマネージャーのuvを使うと、CLIツール(コマンドラインツール)を簡単に作成・インストール・実行できる。
自作のツールを適当に作る場合も、環境構築をuvに任せると実行時に仮想環境などを気にしなくていいので便利。
uv自体のインストールは以下の公式ドキュメントを参照。HomebrewやWinGetなどのパッケージマネージャーも利用できる。
本記事におけるuvのバージョンは以下の通り。
$ uv --version
uv 0.7.7 (Homebrew 2025-05-22)
本記事のサンプルのリポジトリは以下。
uvでプロジェクト作成: uv init --package
uv init --package
でプロジェクトを作成する。
最終的にuv tool
でインストールして実行するので、--package
オプションを付けてPackaged applicationとする。
$ uv init --package my-uv-tool
Initialized project `my-uv-tool` at `/Users/xxxxx/Documents/my-uv-tool`
以下のようなファイル・ディレクトリが生成される。
$ tree my-uv-tool
my-uv-tool
├── pyproject.toml
├── README.md
└── src
└── my_uv_tool
└── __init__.py
作成したディレクトリに移動してuv run
でプロジェクト名(my-uv-tool
)を指定すると、デフォルトのコマンドが実行できる。
$ cd my-uv-tool
$ uv run my-uv-tool
Hello from my-uv-tool!
以降の例では、このままプロジェクトのルートディレクトリ(pyproject.toml
やREADME.md
があるディレクトリ)をカレントディレクトリとして実行しているものとする。
依存ライブラリを追加: uv add
ツール内でサードパーティライブラリを使いたい場合はuv add
で追加する。
$ uv add numpy
clickやfireといったCLIフレームワークを使用するときも同様にuv add
で追加すればよい。
依存ライブラリを削除するのはuv remove
。
コードを修正・追加
デフォルトでは、src/my-uv-tool/__init__.py
にmain()
関数が定義されている。
__init__.py
:
def main() -> None:
print("Hello from my-uv-tool!")
このmain()
関数は不要であれば削除していいが、__init__.py
ファイル自体は中身が空でも残しておく。
ここでは例としてcli.py
とutils.py
をsrc/my_uv_tool
ディレクトリに追加する。
cli.py
:
from my_uv_tool import utils
def main():
print('Hello from cli.py!')
print(f'NumPy version: {utils.numpy_version()}')
utils.py
:
import numpy as np
def numpy_version():
return np.__version__
pyproject.toml
でエントリーポイントを設定
追加したファイルの関数をコマンドとして実行するために、pyproject.toml
の[project.scripts]
にエントリーポイントを設定する。
デフォルトでは、プロジェクト名(my-uv-tool
)に"my_uv_tool:main"
(__init__.py
のmain()
に対応)が割り当てられている。
[project.scripts]
my-uv-tool = "my_uv_tool:main"
例として、以下のようにエントリーポイントを修正・追加する。
[project.scripts]
my-uv-tool = "my_uv_tool.cli:main"
my-np-version = "my_uv_tool.utils:numpy_version"
左辺には任意のコマンド名、右辺には実行する関数を指定する。例えば、my_uv_tool/cli.py
のmain()
関数は"my_uv_tool.cli:main"
のように指定する。
uv run
でコマンド名を指定すると実行できる。
$ uv run my-uv-tool
Hello from cli.py!
NumPy version: 2.2.6
$ uv run my-np-version
2.2.6
作成したツールをインストール: uv tool install
作成したツールをインストールするには、uv tool install
でプロジェクトディレクトリのパスを指定する。
例ではプロジェクトのルートディレクトリにいるので.
を指定すればよい。
$ uv tool install -e .
Installed 2 executables: my-np-version, my-uv-tool
ここで、-e
(--editable
)オプションを付けると、Editable(編集可能)モードでインストールされ、コードの更新が即座に反映される。開発中は便利。ただし、pyproject.toml
の更新(エントリーポイントの変更・追加など)は自動で反映されないので、ツールのアンインストール・再インストールが必要。
uv tool
のbin
ディレクトリが環境変数PATH
に追加されていないとインストール時に警告が出るので要設定。詳細は次節を参照。
PATH
が正しく設定されていれば、インストール後は設定したコマンドをどこからでも実行できる。仮想環境に入ったりする必要はない。
$ my-uv-tool
Hello from cli.py!
NumPy version: 2.2.6
$ my-np-version
2.2.6
インストールされているツールの一覧はuv tool list
。
$ uv tool list
my-uv-tool v0.1.0
- my-np-version
- my-uv-tool
アンインストールはuv tool uninstall
。プロジェクト名を指定する。
$ uv tool uninstall my-uv-tool
Uninstalled 2 executables: my-np-version, my-uv-tool
uv tool install
によるツールのインストール場所はuv tool dir
で確認できる。このディレクトリを手動で操作することは推奨されておらず、あくまでも確認用。
$ uv tool dir
/Users/xxxxx/.local/share/uv/tools
uv tool
のbin
ディレクトリを環境変数PATH
に追加
uv tool
でインストールしたツールをどこからでも実行するには、bin
ディレクトリが環境変数PATH
に含まれている必要がある。
bin
ディレクトリがPATH
に含まれていないとuv tool install
実行時に警告が出る。
以下はWindowsでの例。
warning: `C:\Users\xxxxx\.local\bin` is not on your PATH. To use installed tools,
run `$env:PATH = "C:\Users\xxxxx\.local\bin;$env:PATH"` or `uv tool update-shell`.
警告に書いてあるように、uv tool update-shell
でPATH
を設定できる。
$ uv tool update-shell
実行後はターミナルなどを再起動しないと反映されない。Windowsではユーザーのサインアウト・再サインインが必要だった。
bin
ディレクトリの場所などの詳細は公式ドキュメントを参照。
作成したツールを公開
作成したツール(パッケージ)をPyPIで公開する手順は以下の公式ドキュメントを参照。
PyPIに登録するほどではない場合も、Gitレポジトリを公開すればそこからインストールできる。
$ uv tool install git+https://github.com/nkmk/my-uv-tool
タグやブランチなどの指定方法は以下の公式ドキュメントを参照。uv add
の説明だが、uv tool install
でも同じ。