uvでPythonのCLIツールを作成・インストール・実行

Posted: | Tags: Python, uv

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.tomlREADME.mdがあるディレクトリ)をカレントディレクトリとして実行しているものとする。

依存ライブラリを追加: uv add

ツール内でサードパーティライブラリを使いたい場合はuv addで追加する。

$ uv add numpy

clickやfireといったCLIフレームワークを使用するときも同様にuv addで追加すればよい。

依存ライブラリを削除するのはuv remove

コードを修正・追加

デフォルトでは、src/my-uv-tool/__init__.pymain()関数が定義されている。

__init__.py:

def main() -> None:
    print("Hello from my-uv-tool!")
source: __init__.py

このmain()関数は不要であれば削除していいが、__init__.pyファイル自体は中身が空でも残しておく。

ここでは例としてcli.pyutils.pysrc/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()}')
source: cli.py

utils.py:

import numpy as np


def numpy_version():
    return np.__version__
source: utils.py

pyproject.tomlでエントリーポイントを設定

追加したファイルの関数をコマンドとして実行するために、pyproject.toml[project.scripts]にエントリーポイントを設定する。

デフォルトでは、プロジェクト名(my-uv-tool)に"my_uv_tool:main"__init__.pymain()に対応)が割り当てられている。

[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.pymain()関数は"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 toolbinディレクトリが環境変数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 toolbinディレクトリを環境変数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-shellPATHを設定できる。

$ 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でも同じ。

関連カテゴリー

関連記事