Python「uv」実践編!ライブラリ追加と依存関係管理をマスター
こんにちは!前回に引き続き、Pythonの超高速パッケージ管理ツール「uv」について学んでいきます。
前回は、uv init でプロジェクトを作成し、uv run で実行するところまで試しました。
今回は、Python開発に欠かせない「ライブラリのインストール」を uv でどう行うのか、実際にやってみた記録を残していきます!
pip install に慣れている方も、uv のスマートなパッケージ管理を体験してみましょう!
1. まずは目標設定!Flask + PostgreSQL 環境構築
ライブラリをインストールする前に、今回の学習プロジェクトの目標を決めます。
現在学習中の **Flask** を使ったWebアプリケーション開発と、**PostgreSQL** を使ったデータベース操作の学習環境を、uv を使って構築することにしました。
つまり、「Flaskの学習プロジェクトをuvで立ち上げよう!」ということです。
2. ライブラリをインストール! `uv add` を試す
普段、Pythonでライブラリをインストールする際は、
pip install ライブラリ名
というコマンドを使いますよね。
uv でライブラリをインストールするには、主に2つの方法があります。
pyproject.tomlファイルのdependenciesにライブラリ名を追加し、uv syncコマンドで環境を同期する。uv add ライブラリ名コマンドを実行する。
どちらの方法でも良いのですが、今回は uv add ライブラリ名 を試してみることにしました。
仮想環境のアクティベート
uv add コマンドを実行する前に、uv が作成した仮想環境をアクティベートする必要があります。
(前回 uv run を実行した際に、.venv ディレクトリが作成されているはずです。)
ターミナルで以下のコマンドを実行します。
source .venv/bin/activate
プロンプトの先頭に `(.venv)` と表示されれば、アクティベート成功です。
uv add flask の実行
仮想環境がアクティベートされた状態で、いよいよFlaskをインストールします。
uv add flask
実行すると、以下のような出力が表示されました。
Resolved 9 packages in 232ms
Prepared 7 packages in 134ms
Installed 7 packages in 6ms
+ blinker==1.9.0
+ click==8.1.8
+ flask==3.1.0
+ itsdangerous==2.2.0
+ jinja2==3.1.6
+ markupsafe==3.0.2
+ werkzeug==3.1.3
Flask本体だけでなく、依存関係にあるライブラリ (blinker, clickなど) も一緒にインストールされているのが分かりますね。
そして、処理速度がめちゃくちゃ速い…!
pyproject.toml の自動更新
uv add flask を実行した後、pyproject.toml ファイルを確認してみると…
[project]
# ... (省略) ...
dependencies = [
"flask>=3.1.0", # この行が自動で追加されている!
]
なんと、dependencies に "flask>=3.1.0" が自動で追加されていました!
わざわざ手動で編集する必要がないのは、とても楽ですね。
uv.lock ファイルの自動生成
さらに、プロジェクトディレクトリに uv.lock という新しいファイルが作成されていることに気づきました。
中身を見てみると…
# uv.lock (一部抜粋)
version = 1
requires-python = ">=3.11"
[[package]]
name = "blinker"
version = "1.9.0"
source = { registry = "https://pypi.org/simple" }
[[package]]
name = "click"
version = "8.1.8"
source = { registry = "https://pypi.org/simple" }
requires-python = ">=3.8"
[[package]]
name = "flask"
version = "3.1.0"
source = { registry = "https://pypi.org/simple" }
requires-python = ">=3.8"
dependencies = [
{ name = "blinker" },
{ name = "click" },
{ name = "itsdangerous" },
{ name = "jinja2" },
{ name = "werkzeug" },
]
# ... (以下、依存関係の詳細が続く) ...
この uv.lock ファイルは、インストールされたライブラリとその正確なバージョン、依存関係を記録しておくためのものです。
主な役割は以下の2つです。
- 依存関係の固定: プロジェクトで使用するライブラリのバージョンを固定し、他の環境でも同じバージョンのライブラリがインストールされるようにします。
- 再現性の確保:
uv.lockファイルがあれば、どの環境でも同じ依存関係を再現できるため、開発環境と本番環境での動作の違いを防ぐことができます。
npm の package-lock.json や yarn の yarn.lock と同じような役割ですね。
当初試そうと思っていた「pyproject.toml を編集して uv sync」という方法も、結局はこの uv.lock を使って環境を同期する仕組みのようです。
であれば、普段のライブラリ追加は uv add を使うのがシンプルで良さそうだと感じました。
ついでに、今回の目標に必要な Flask-SQLAlchemy も uv add で追加しておきました。
uv add Flask-SQLAlchemy
3. requirements.txt を作成する (`uv pip compile`)
開発したアプリケーションをサーバーなどにデプロイする際、requirements.txt ファイルが必要になることがあります。
uv を使って requirements.txt を作成するには、以下のコマンドを実行します。
uv pip compile pyproject.toml -o requirements.txt
このコマンドは、pyproject.toml の dependencies を元に、依存関係を解決し、requirements.txt ファイルとして出力してくれます。
実際に生成された requirements.txt を見てみると、普段 pip freeze で作成するものとは少し形式が異なりますが、ライブラリとバージョンが記述されており、問題なく使えそうです。
これで、デプロイの準備もバッチリですね!
4. まとめとこれから
今回は、uv を使ってPythonライブラリをインストールする方法 (uv add) と、その際に自動生成される uv.lock ファイルの役割、そして requirements.txt を作成する方法 (uv pip compile) について学びました。
uv add を使うことで、
- ライブラリのインストール
pyproject.tomlへの依存関係の追加uv.lockファイルによる依存関係の固定
が一度に行えるのは、非常に効率的だと感じました。
uv はまだ新しいツールですが、その高速性と利便性から、今後のPython開発のスタンダードになる可能性を秘めていると思います。
新しいツールを導入するのは、最初は少し面倒に感じるかもしれませんが、「これでいいや」と現状維持に甘んじず、新しい技術に触れ続けることは、エンジニアとしての成長に繋がるはずです。
私も、これから積極的に uv を使って、その真価を体験していきたいと思います!