2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】uvを使ってみた

2
Posted at

■uvとは?

uv は、Pythonの高速linterである Ruff を開発したAstral社が作った、Rust製のPythonパッケージマネージャーです。

一言でいうと、pip・venv・pip-tools・pyenv をまとめて1本に置き換えるツールです。

■pipの何が辛かったか

従来のPython環境構築は、複数のツールを組み合わせる必要がありました。

# 従来の典型的なワークフロー
python -m venv .venv          # 仮想環境の作成
source .venv/bin/activate     # 有効化(毎回必要)
pip install requests          # パッケージインストール
pip freeze > requirements.txt # 依存関係の記録(バージョンが完全固定されない)

主な問題点:

  • venvpippip-toolspyenv と、ツールが分散していて管理が煩雑
  • pip install が遅い(特にCIや大規模プロジェクト)
  • pip uninstall しても推移的依存関係が残り、環境が汚れる
  • requirements.txt だけでは再現性が不完全
  • Pythonのバージョン管理には別途 pyenv が必要

■uvのメリット

1. 圧倒的な速さ

Rust製かつ並列ダウンロード+効率的なグローバルキャッシュにより、インストール速度が向上します。

2. ツールが1本に集約

役割 従来のツール uv
パッケージインストール pip uv add
仮想環境 venv / virtualenv uv venv
依存関係ロック pip-tools / Poetry uv.lock(自動生成)
Pythonバージョン管理 pyenv uv python install

3. グローバルキャッシュでディスク節約

venvでは各プロジェクトが依存関係を丸ごとコピーしますが、uvはグローバルキャッシュを使うため、同じパッケージは一度だけダウンロードされます。

プロジェクトが増えるほど恩恵が大きいです。

4. uv.lock で完全な再現性

uv.lock に全パッケージの正確なバージョンが記録されるため、ローカル・本番・CI環境で完全に同じ状態を再現できます。

pip freeze より信頼性が高いです。

5. アンインストールがきれい

uv remove は、指定パッケージの推移的依存関係も一緒に削除します。

pipでは孤立したパッケージが残り続けるという問題がありました。

■基本的な使い方

◆プロジェクト初期化

uv init my-project
cd my-project

以下のファイルが自動生成されます。

├── .python-version
├── main.py
├── pyproject.toml # プロジェクト設定
└── README.md

◆Pythonバージョン管理(pyenv不要)

# インストール可能なバージョン一覧
uv python list

# 特定バージョンをインストール
uv python install 3.12

# プロジェクトのPythonを指定
uv venv --python 3.12

◆パッケージ管理

# パッケージ追加(pyproject.toml + uv.lock に自動記録)
uv add requests fastapi

# 開発用依存の追加
uv add --dev pytest ruff

# パッケージ削除(推移的依存も一緒に削除)
uv remove requests

# 環境をロックファイルに同期
uv sync

パッケージをインストールすると、「pyproject.toml」や「uv.lock」に書き込まれていることがわかります。

package-lock.jsonのように固定できるのがいいです。

image.png

◆スクリプト実行(activate不要)

# venv の activate なしで実行できる
uv run python main.py
uv run pytest
uv run ruff check .

仮想環境を起動しないでも、各種ライブラリのコマンドを実行できます。

◆pipとの比較コマンド

やりたいこと pip uv
パッケージ追加 pip install requests uv add requests
パッケージ削除 pip uninstall requests uv remove requests
一覧表示 pip list uv pip list
requirements.txtから pip install -r requirements.txt uv pip install -r requirements.txt
環境同期 (pip-toolsが必要) uv sync
スクリプト実行 source .venv/bin/activate && python uv run python

■知っておくと便利な機能

uvx:ツールをインストールせず一発実行(pipx代替)

uvxuv tool run のエイリアス)を使うと、ツールを一時的な隔離環境でインストールして実行できます。

グローバル環境を汚さずに使い捨て実行できるのが便利です。

# ruff をインストールせず即実行
uvx ruff check .

# black でフォーマット(インストール不要)
uvx black main.py

# インストール済みツールを一括アップグレード
uv tool upgrade --all

Pythonバージョンの固定

プロジェクトに特定の Python バージョンを固定することができ、uv を使う全員が同じ Python バージョンを使えるようになります。

# プロジェクトのPythonを3.12.9に固定
uv python pin 3.12.9

# .python-version ファイルが生成される(Gitにコミットする)
cat .python-version
# 3.12.9

バージョン制約の指定

# バージョンを指定して追加
uv add "requests>=2.28,<3.0"
uv add "django==4.2.*"

# 既存パッケージのバージョン制約を更新
uv add "requests>=2.32"

# 最新バージョンに一括アップグレード
uv lock --upgrade
uv sync

既存プロジェクトからの移行

既存の requirements.txt はそのまま使えます。

# requirements.txt がある既存プロジェクトへの適用
uv pip install -r requirements.txt

# 新しいuvプロジェクトとして移行する場合
uv init
uv add $(cat requirements.txt)  # または手動でuv addしていく

■まとめ

uvはフロントエンドのnpmに近い体験をPythonにもたらしてくれるツールです。

  • 速い、きれい、ツールが1本にまとまる
  • 既存のpipワークフローとの互換性も高く、移行コストが低い
  • uv.lock による再現性はチーム開発・CI環境で特に効果

■参考リンク

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?