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
を使って、その真価を体験していきたいと思います!