パッケージ管理したい(uv
)
$ uv init プロジェクト名 --app --package --vcs git
$ uv python pin バージョン
$ uv add パッケージ名
$ uv add --dev パッケージ名
$ uv update
$ uv sync
// 開発と検証
$ uv run コマンド
$ uv pip compile
$ uv pip check
// パッケージ公開
$ uv build
$ uv publish
// 補助コマンド
$ uv tool install パッケージ名
$ uv tool uninstall パッケージ名
$ uv tool list
// pip互換モード
$ uv pip install パッケージ名
$ uv pip uninstall パッケージ名
$ uv pip freeze
uv
はPython環境の管理とパッケージ管理を一元管理できるツールです。
.python-version
でPython環境を管理し、
pyproject.toml
とuv.lock
のファイルを使って依存関係を管理できます。
インストールしたい(uv
)
$ brew install uv
$ which -a uv
/opt/homebrew/bin/uv
$ uv --version
uv 0.6.13 (Homebrew 2025-04-07)
$ which -a uvx
/opt/homebrew/bin/uvx
$ uvx --version
uv-tool-uvx 0.6.13 (Homebrew 2025-04-07)
uv
はHomebrewでインストールできます。
pipx
と同じような思想のuvx
コマンドも使えるようになります。
注釈
pip
やpipx
、poetry
でもインストールできます。
CI/CDで使う場合はpipx install uv
がよいと思います。
新規プロジェクトしたい(uv init
)
$ uv init --version
uv-init 0.6.13 (Homebrew 2025-04-07)
// デフォルト(--app --no-package)
$ uv init PROJECT_NAME
// ライブラリ作成(--lib --package)
$ uv init PROJECT_NAME --lib
// CLI&パッケージ(--app --package)
$ uv init PROJECT_NAME --app --package
// ドキュメントのみ
$ uv init --bare --no-package PROJECT_DOCS
init
コマンドでプロジェクトを初期化できます。
同名のプロジェクトがすでに存在する場合は、エラーになります
プロジェクト名を省略した場合は、カレントディレクトリが初期化されます。
目的にあったディレクトリ構造を自動で構成できるオプションも用意されています。
デフォルトは--app --no-package
に相当し、ローカルで利用するCLIの仕様になっています。
PyPI |
ライブラリ( |
アプリ( |
---|---|---|
公開したい( |
|
|
公開しない( |
|
|
注意
--app
/ --lib
/ --script
オプションは同時に使えないようになっています。
// プロジェクト名を指定して初期化する
$ uv init PROJECT_NAME
Initialized project `PROJECT_NAME` at `./PROJECT_NAME`
// 初期化後のディレクトリ構造
$ tree PROJECT_NAME
PROJECT_NAME
├── README.md
├── hello.py
└── pyproject.toml
// 既存のプロジェクトがあるとエラーになる
$ uv init PROJECT_NAME
error: Project is already initialized in `./PROJECT_NAME`
パッケージを追加したい(uv add
/ uv remove
)
$ uv add パッケージ名
$ uv remove パッケージ名
$ uv add パッケージ名==バージョン
$ uv add パッケージ名 --extra パッケージ名
$ uv add --dev パッケージ名s
add
コマンドでpyproject.toml
に依存パッケージを追加できます。
remove
コマンドで削除できます。
パッケージをインストールしたい(uv sync
/ uv lock
)
$ uv lock
$ uv sync
$ uv sync --all-extras
lock
コマンドでロックファイル(uv.lock
)を更新できます。
sync
コマンドでロックファイルを元に、プロジェクトに必要なパッケージを追加/更新できます。
--all-extras
オプションで、依存パッケージのオプションも追加できます。
パッケージを実行したい(uv run
)
$ uv run コマンド名
// ユニットテストを実行
$ uv run pytest
// フォーマッターを実行
$ uv run ruff format
// 自作ツールを実行
$ uv run 自作ツール名 [オプション]
uv run
で仮想環境に追加したパッケージを実行できます。
またpyproject.toml
の[project.scripts]
で設定した自作ツールも実行できます。
自作パッケージの開発時にもっとも多く使うコマンドです。
パッケージを公開したい(uv build
/ uv publish
)
$ uv build
$ uv publish
$ uv publish -r testpypi
build
コマンドでパッケージを作成できます。
/dist/
の中にsdist
形式とwheel
形式のパッケージが生成されます。
publish
コマンドでPyPIにパッケージを公開できます。
-r testpypi
でTestPyPIにテスト公開できます。
作成したパッケージをはじめて公開する場合は、TestPyPIにアップできるか試してみるとよいです。
注意
同じパッケージ名はPyPIに登録できません。 パッケージを公開する前に名前の重複がないか確認が必要です。
また、自分のパッケージでも同じバージョンを追加(=上書き)することはできません。 軽微な修正であっても、別のバージョンにして公開する必要があります。
pip互換したい(uv pip
)
$ uv pip install パッケージ
uv pip
でpipコマンドの互換モードを利用できます。
ロックファイルや仮想環境を作成せずにパッケージをインストールできます。
一時的なインストールに利用できます。
仮想環境したい(uv venv
)
$ cd PROJECT_NAME
$ uv venv
Using CPython 3.12.7
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate.fish
$ source .venv/bin/activate.fish
venv
コマンドで仮想環境を作成できます。
仮想環境はデフォルトで.venv/
ディレクトリに作成されます。
source .venv/bin/activate.fish
で仮想環境をアクティベートできます。
注釈
uv init
やuv add
、uv sync
を実行するときに.venv
は自動で作成されます。
なので、uv venv
は省略して構いません。
CI/CD環境でuv pip install
を使う場合は、uv venv
を事前に書いておくとよさそうです。
Pythonを管理したい(uv python
)
$ uv python pin 3.12
Pinned `.python-version` to `3.12`
$ uv run python --version
Python 3.12.7
// HomebrewのPythonは3.13.0
$ python3 --version
Python 3.13.0
uv
の大きな特徴のひとつはPythonのバージョンも管理できることです。
uv python pin
コマンドで、プロジェクトが利用するPythonのバージョンを固定できます。
ピン留めしたバージョン情報は.python-version
に保存されます。
注釈
.python-version
はuv
やpyenv
などで共通に使われる
Pythonのバージョンを指定するためのファイルです。
// Pythonの実行環境をインストール
$ uv python install 3.12
Installed Python 3.12.7 in 5.67s
+ cpython-3.12.7-macos-aarch64-none
// 実行環境をアンインストール
$ uv python uninstall 3.12
// 実行環境がインストールされるパスを確認
$ uv python dir
~/.local/share/uv/python
uv python install
で指定したPython実行環境をインストールできます。
Pythonはuv python dir
で表示されるパスにインストールされます。
$ uv python list
インストール可能なPythonの実行環境は
uv python list
で確認できます。
$ uv python list --only-installed
cpython-3.13.0-macos-aarch64-none /opt/homebrew/opt/python@3.13/bin/python3.13 -> ../Frameworks/Python.framework/Versions/3.13/bin/python3.13
cpython-3.12.7-macos-aarch64-none /opt/homebrew/opt/python@3.12/bin/python3.12 -> ../Frameworks/Python.framework/Versions/3.12/bin/python3.12
cpython-3.11.10-macos-aarch64-none /opt/homebrew/opt/python@3.11/bin/python3.11 -> ../Frameworks/Python.framework/Versions/3.11/bin/python3.11
cpython-3.11.10-macos-aarch64-none ~/.local/share/uv/python/cpython-3.11.10-macos-aarch64-none/bin/python3.11
cpython-3.9.6-macos-aarch64-none /Library/Developer/CommandLineTools/usr/bin/python3 -> ../../Library/Frameworks/Python3.framework/Versions/3.9/bin/python3
--only-installed
オプションで、現在インストール済みのPython実行環境を確認できます。
システムのデフォルトとHomebrewでインストールしたパスも表示されます。
外部ツールしたい(uv tool
/ uvx
)
// CLIパッケージをインストール
$ uv tool install パッケージ名
// CLIパッケージをアンインストール
$ uv tool uninstall パッケージ名
// CLIパッケージを実行
$ uv tool run コマンド名 [オプション]
$ uvx コマンド名 [オプション]
uv tool
でCLI形式で公開されているパッケージを、ユーザーごとの仮想環境で管理できます。
uv tool run
もしくはuvx
で実行できます。
注釈
uv tool run
とuvx
は同じことができますが、内部処理が異なります。
uvx
は簡単に入力できるので普段使いに適していますが、
スクリプトから呼び出すときはuv tool run
を使うほうがよいそうです。
// パッケージを確認する
$ uv tool list
$ uv tool dir
~/.local/share/uv/tools
$ uv tool update-shell
Executable directory ~/.local/bin is already in PATH
uv tool
でインストールしたパッケージの一覧を確認できます。
uv tool
でインストールしたパッケージ本体はuv tool dir
ディレクトリに保存されます。
コマンドは~/.local/bin
に(エイリアスが)配置されます。
uv tool update-shell
を実行してパスを通すことができます。
注意
~/.local/bin
はpipx
でインストールされるコマンドと同じパスです。
同名のコマンドがある場合はインストールに失敗します。
uv
経由のコマンドに置き換える場合は、まず
pipx uninstall
してから
uv tool install
してください。
// パッケージを更新する
$ uv tool upgrade パッケージ名
$ uv tool upgrade --all
uv tool upgrade
でパッケージを更新できます。
--all
オプションで一括更新できます。
注釈
現在、uvのGitHub issueで議論されているようです。
→ issueはopenになっていますが、uv tool
でインストールしたコマンドを、
一括でアップグレードする方法はありません。upgrade --all
オプションが追加されていました(2024/11/29)
ユニットテストしたい(uvx pytest
)
$ uv tool install pytest
$ uvx pytest
フォーマッター&リンターしたい(uvx ruff
)
$ uv tool install ruff
$ uvx ruff format
$ uvx ruff check
他ツールと比較したい
以下のuv
のコマンドが、他のパッケージ管理ツール(poetry
、pip
、pipx
)の
どのコマンドに対応しているかを整理しました。
機能 |
|
|
|
|
---|---|---|---|---|
プロジェクト初期化 |
|
|
× |
× |
仮想環境作成 |
|
内部で自動 |
|
内部で自動 |
Pythonバージョン固定 |
|
.python-version に依存(pyenv) |
× |
× |
Pythonバージョン取得 |
|
× |
× |
× |
パッケージ追加 |
|
|
|
|
開発用依存追加 |
|
|
|
× |
パッケージ削除 |
|
|
|
|
依存ロック生成 |
|
|
|
× |
依存インストール |
|
|
|
× |
パッケージ更新 |
|
|
|
|
パッケージ実行 |
|
|
|
|
ビルド |
|
|
|
× |
パッケージ公開 |
|
|
× ( |
× |
CLIツールのインストール |
|
× |
× |
|
CLIツールの実行 |
|
× |
× |
|
CLIツールの一覧確認 |
|
× |
× |
|
一時的なインストール |
|
× |
|
|
Pythonには標準のpip
のほかにさまざまなパッケージマネージャーが存在します。
力不足なpip
の機能の補うためにさまざまなツールが登場し、
まるで戦国時代のような混乱がずっと続いていました。
しかし、2024年ころに、それらの役割をひとつに統合し、高速で一貫性のある操作を提供する
パッケージマネージャーとしてuv
が注目されはじめました。
uv
はPEPに準拠しており、今後のデファクトスタンダードになっていく可能性が高いため、
新規プロジェクトはuv
で作りはじめるのがよいと思います。
注釈
とても人気の高いプログラミング言語であるPythonですが、 長い間パッケージの依存性を管理する方法が標準化されていませんでした。
2018年のPIP518で導入されたpyproject.toml
は、
それまでのsetup.py
やrequirements.tx
に代わるモダンなパッケージ記述方式です。
パッケージングに関する詳細を確認したい場合は、 PEP518(ビルドツールの標準化)、 PEP517(ビルド手順の標準化)、 PEP621(メタデータの標準化)、 PEP508(依存関係の記法) の公式ドキュメントを参照してください。