今、Pythonパッケージ管理は「uv」が新定番になりつつあります。驚くほど高速で柔軟だからです。この記事では、pipやcondaとの違いから、uvでのプロジェクト作成、パッケージ管理、スクリプト実行まで、特に筆者が理解しづらかったポイントを重点的に解説します。この機会に、一緒にuvへ乗り換えてみませんか?
皆さん、こんにちは! @ITのDeep Insider編集長、一色(いっしき)です。
今回は、「pipの10〜100倍速い」と注目されているPythonパッケージマネジャー「uv」の入門記事です。この記事を読むと、以下をまとめて理解できます。
なお、該当箇所にジャンプしたい場合は、上記の目次内のリンクをご活用ください。
『Deep Insider編集長のネタ帳 ― データ分析・AI・機械学習・Pythonでの気付きと発見』
@ITのDeep Insider編集長「一色」が、日ごろの情報収集や開発、執筆・編集を通じて得た“技術的な気付き”や“新たな発見”を自由気ままにつづるオピニオン連載。気になるデータ分析を試したり、AI・機械学習で迷走したり、Pythonとツール活用を語ったり。不定期更新ですが、疲れたときの息抜きにどうぞ! 次回以降の新着記事を見逃したくない方は、ぜひ以下のメール通知の登録をお願いします。
長年、pipとcondaを使い、特に不満もなく作業してきた筆者ですが、最近はuvを見かける機会が急増し、「このまま知らずにいると、時代に取り残されてしまうのではないか」という危機感を強く持つようになりました。
実際、Anthropicが提供する“MCP”公式ドキュメントでも、uvを使った環境構築方法しか説明されていません(なお、MCPについては前回記事で解説しています)。
もちろん、ドキュメント通りにコマンドを実行すれば環境は作れます。しかし「これからは普段のPython作業も、pipやcondaからuvへ移行した方がいいのでは?」という思いが拭えず、「uv」が話題になるたびに情報を追いかけていました。けれども、いつも「何となく分かっていない」という感覚が残っていたのです。
というのも、uvのPythonバージョン管理環境や基本操作は、従来のpip+venvやcondaとは少し異なる部分があり、筆者は基本的な考え方をきちんと理解できていなかったからです。こうしたポイントを分かりやすく整理した記事やスライドは、これまであまり見かけませんでした。
そこで本稿では、かつての筆者と同様に「uvが気になるけれど、よく分かっていない」という思いを抱えているPythonユーザーの方々に向け、筆者自身が「こう説明してくれたら理解できた」と感じた【気付き】をベースに、分かりやすくuvの基礎を整理して解説します。今回こそ本当に、私と皆さんの全員でuvに乗り換えましょう!
小ネタですが、「uv」という名前の由来は「UltraViolet(紫外線)」=“速いイメージ”に由来しているそうです。しかし、「uv」はググラビリティ(=Google検索しやすさ)が最悪ですよね。「python uv」などで検索しないと関連情報が出てきません(苦笑)。
それはさておき、uvとは、
などをオールインワンで提供する、高速かつ柔軟なPythonパッケージマネジャーです。
pip+venvに対して互換性を持ちながらも、Pythonパッケージ管理は、パフォーマンスに定評があるプログラミング言語の「Rust」製であるため、pipコマンド比で10〜100倍速い超高速動作を実現しています。condaのように「仮想環境単位でPython本体や依存パッケージを一括管理する」形式ではなく、「プロジェクト/Pythonバージョン/仮想環境を別々に管理できる」ことで、管理性を保ちながら柔軟に組み合わせられ、しかも高速という、まさに全てのPythonパッケージマネジャーの“いいとこ取り”を極めた決定版となっています。
加えてuvは、pipよりも先進的な依存性解決機能を備えている点も大きな魅力です。Pythonパッケージ間の依存関係の衝突を避けやすく、より信頼性の高い環境構築が可能です。こういったメリットの数々を見ると、デファクトスタンダードになるのも納得ですね。
ここで、他の代表的なPythonパッケージ管理(pip+venvやconda)と比較してみましょう。筆者はuvとpip+venv、condaとの対応関係を表1のように捉えています。
作業工程 | pip+venv | conda | uv |
---|---|---|---|
プロジェクト作成 | 手動でディレクトリ作成 | 手動でディレクトリ作成 | uv init |
各バージョンのPython用意 | 手動インストール、または pyenvで管理 |
不要(仮想環境作成時に 自動インストール) |
自動、または uv python install |
プロジェクトでのPython指定 | pyランチャーなどで選択 | 仮想環境作成時に指定 | uv python pin |
仮想環境作成 | python -m venv | conda create | uv venv |
パッケージインストール | pip install | conda install | uv add |
パッケージ一括インストール | pip install -r requirements.txt | conda env create、または conda install --file |
uv sync |
Python製CLIツールの実行 | pipxコマンド | (該当機能なし) | uvxコマンド |
この表を見ただけで「なるほど!」と感じた方は、本稿のポイントを既にほぼ理解できていると思います。ただし、具体的な詳細はこれだけでは分からずに誤解しやすいと思うので、以下ではuvの作業の流れを概観した上で、各工程を具体的に解説していきます。
図1では、uvを使った基本的な作業の流れと、「プロジェクト」「Pythonバージョン(uv-managed Python versions)」「仮想環境」といった各概念の役割や関係を視覚的にまとめました。まずは、この図で全体像を押さえてから、具体的な作業内容を見ていきましょう。
この図からも分かるように、uvでは「プロジェクト」を中心に、共通のuv-managed Python versionsからPythonバージョンを指定し、明示的もしくは自動的に仮想環境を作成します。Python本体(ランタイム)は一度用意すれば複数プロジェクト間で共有でき、作業ごとにムダなく環境を準備できるのも大きなメリットです。「pipともcondaとも作業の流れが異なる」というのが、筆者にとってのつまずきポイントであり、「最初に知っておきたかった」と強く感じた【気付き】でした。
あとは、この作業フローに沿ってコマンドを実行していくだけです。ここからは、実際にコードを確認しながら、自分でタイプして試してみてください。ローカル環境(Windows/macOS/Linux)での実行を推奨します(※Google Colabでも一部試せますが、仮想環境は利用できないため、システム環境に直接、Pythonパッケージをインストールする形になります)。
以降の各uvコマンドの説明は、基本的にuv公式ドキュメント(英語)に準拠しています。ただし本稿では、基本作業フローの順序で学べるので基礎を理解しやすいこと、そして日本語で読めること、この2つが大きなメリットです。ここで基礎とコツをつかんだら、実践しながら公式ドキュメントも活用してみてください。
uvのインストール手段は幾つか用意されています(参考ページ)。例えばpipやpipxコマンドでインストールすることもできますが、通常は「単独(スタンドアロン)インストーラー」を使ってインストールします。
単独インストーラーにはWindows用とmacOS/Linux用があるので、リスト1から適切なコマンドをコピーしてターミナル上で実行してください。
# Windows用(PowerShellコマンド):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# macOS/Linux用(シェルコマンド):
curl -LsSf https://astral.sh/uv/install.sh | sh
次に、プロジェクト(project)と呼ばれる「Pythonプログラミング作業用のディレクトリ」を作成します(参考ページ)。
pipやcondaには「プロジェクト」という概念はなく、単に作業用フォルダー(=ディレクトリ)を作るだけですが、uvではプロジェクト単位で環境全体を管理します。ここが、今回筆者にとって最大の【気付き】でした。
このプロジェクトには、「Pythonバージョンの情報(.python-versionファイル)」や「仮想環境の内容(.venvディレクトリ)」がひも付けられます。uvでは、このプロジェクト単位でPython作業全体を管理します。
そのプロジェクト作成コマンドは直感的で分かりやすいです。リスト2のように、「初期化」を意味するinitにプロジェクト名(例:hello-world)を続けるだけです。
# hello-worldプロジェクトを作成(同時にディレクトリも作成されます)
uv init hello-world
# 作成したプロジェクトディレクトリに移動する(change directory)
cd hello-world
uvは、システムにPython本体がインストールされていれば、それを設定なしで自動的に使ってくれます。また、仮想環境作成コマンドを実行したタイミングで、自動的にPython本体をインストールしてくれます。よって、明示的にPython本体をインストールする必要はありません。
しかし本稿では、あえて明示的にインストールすることで、uvの仕組みを理解できるようにします(参考ページ)。この作業も、直感的なuv python installコマンドで簡単に実行できます(リスト3)。インストール済みのPythonバージョンは、uv python listコマンドで簡単に確認できます。
# バージョン「3.12」「3.13」「3.14」のPython本体をインストール
uv python install 3.12 3.13 3.14
# インストール済みバージョンを一覧表示
uv python list
# 出力例(一部省略):
# cpython-3.14.0b3-linux-x86_64-gnu /home/user/.local/share/uv/python/cpython-3.14.0b3-linux-x86_64-gnu/bin/python3.14
# cpython-3.13.5-linux-x86_64-gnu /home/user/.local/share/uv/python/cpython-3.13.5-linux-x86_64-gnu/bin/python3.13
# cpython-3.12.11-linux-x86_64-gnu /home/user/.local/share/uv/python/cpython-3.12.11-linux-x86_64-gnu/bin/python3.12
# cpython-3.11.13-linux-x86_64-gnu <download available>
# cpython-3.10.18-linux-x86_64-gnu <download available>
この例では、uv python installコマンドで3.13を指定したため、「Python 3.13」の最新パッチバージョンである「3.13.5」がインストールされました(※Pythonのバージョン番号は「メジャー.マイナー.パッチ」という形式です)。「cpython-3.13.5-linux-x86_64-gnu」が正式な本体名ですが、コマンドで指定した値に基づき、uvが自動的に最適なバージョンを選んでくれました。
ちなみに、前述の「概要」でも書きましたが、このようにしてインストールされたPython本体はローカル環境に保持され、プロジェクト間で共有されます。このローカル環境は、リスト3の例では「/home/user/.local/share/uv/python/」というuv専用ディレクトリになっています。
Python本体を準備できたので、次はプロジェクトにそのバージョンを指定しましょう。
具体的にはリスト4のように、uv python pinコマンドでプロジェクトで使用するPythonバージョンを固定(pin)します(参考ページ)。そのバージョン情報は、自動的に作成される.python-versionファイルに格納されます。
# バージョン「3.13」のPython本体をプロジェクトに指定
uv python pin 3.13
# .python-versionファイルの内容を出力
cat .python-version
# 出力例: 3.13
さらに、プロジェクトに対応する仮想環境を作成しましょう。これにより、システムのPython環境に影響を与えずに、プロジェクト専用のPython環境で自由にPythonパッケージをインストールして作業できるメリットがあります。仮想環境は通常、次のuv addコマンド実行時に自動で作成されるため、ここでの作成は任意です。
本稿では仕組み理解のため、明示的に作成します。これには、リスト5のようにuv venvコマンドを実行するだけです(参考ページ)。これにより、指定バージョンのuv-managed Python(uv管理下にあるPython)本体が仮想環境で使われるようになります。
# hello-worldプロジェクトに対応する仮想環境を作成
uv venv
# 出力例(筆者が日本語で意訳):
# CPython 3.13.13を使用しています
# 「.venv」ディレクトリに仮想環境を作成しました
# 「source .venv/bin/activate」(macOS/Linux用)や「.venv\Scripts\activate」(Windows用)コマンドで仮想環境を有効化できます
なお、作成した仮想環境は、プロジェクトディレクトリ内に.venvディレクトリとして作成されています。このディレクトリ内には、仮想環境を有効化するスクリプトがあります。通常のpythonコマンドを使うには、macOS/Linuxではsource .venv/bin/activateコマンドを、Windowsでは.venv\Scripts\activateコマンドを事前に実行する必要があります。後ほどあらためて触れますので、忘れないように覚えておいてください。
いよいよ、uvの本領発揮です。必要なPythonパッケージを、プロジェクト環境に個別にインストールします。
具体的にはリスト6のように、uv addコマンドで簡単にインストールできます(参考ページ)。requestsとpandasパッケージをインストールしていますが、このコマンドも直感的で分かりやすいですね。
# requestsパッケージとpandasパッケージをインストール
uv add requests pandas
# 出力例:
# Resolved 17 packages in 184ms
# Prepared 11 packages in 600ms
# Installed 11 packages in 24ms
# + certifi==2025.6.15
# + charset-normalizer==3.4.2
# + idna==3.10
# + numpy==2.3.1
# + pandas==2.3.0
# + python-dateutil==2.9.0.post0
# + pytz==2025.2
# + requests==2.32.4
# + six==1.17.0
# + tzdata==2025.2
# + urllib3==2.5.0
合計で「808ms(ミリ秒)」、つまり1秒未満で全てのインストールが完了しています。非常に高速ですね。
ちなみに、特定のバージョンをインストールしたい場合は、uv add "requests==2.23.0"のように指定すればOKです。バージョン指定には==や>=、<などの演算子が使えます。複数の範囲指定で"requests>=2.23.1,<3.0.0"のように書くと、この範囲条件を満たす最新版がインストールされます。
さて、ここまでの作業により、プロジェクト内容は図2のようになっています。各ファイルやディレクトリの意味は、図中の説明を参考にしてください。
なお、uv addの代わりに、pip互換のuv pip installも使えます(参考ページ)。ただし挙動はuv addと異なり、uvの依存情報管理(図1のpyproject.tomlやuv.lock)には反映されず、環境に直接インストールされるだけになるため、通常はお勧めしません。「pipを使い続けたいが、uvの高速性は欲しい」という、uvへの移行が難しい人向けの互換インタフェースと考えてください。
例えばGoogle Colabでも、uvの高速性だけを活用できます。具体的には、まずLinux用の! curl -LsSf https://astral.sh/uv/install.sh | shコマンドでuvをインストールしてから、次にpip互換のuv pip installコマンドを使って、! uv pip install --system requests pandasのようにして個別のPythonパッケージをシステム環境に高速にインストールできます。--systemオプションは、仮想環境ではないシステム環境にインストールするためのフラグです。
ここまででuvを使ったPython環境の準備が整いました! プロジェクト作成時に自動生成されたmain.pyというPythonスクリプトが既にあるので、リスト7のように書き換えて実行してみましょう。
import requests
def main():
resp = requests.get("https://api.github.com")
print(f"GitHub APIのステータスコードは {resp.status_code} です。")
if __name__ == "__main__":
main()
このPythonスクリプトを実行するには、リスト8のようにuv runコマンドを実行するだけです(参考ページ)。
# Pythonスクリプトを実行
uv run main.py
# 出力例:
# GitHub APIのステータスコードは 200 です。
uv runコマンドでは、プロジェクトに対応する仮想環境が自動的に有効化されるため、明示的な有効化コマンドの実行は不要です。
スクリプトではなくインタラクティブシェルでPythonコードを実行したい場合も、uv run pythonコマンドを使えば、仮想環境が自動的に有効化されるため便利です(参考ページ)。
一方で、通常のpythonコマンドを使う場合は、仮想環境を手動で有効化する必要があります。前掲のリスト5で出力された通り、macOS/Linuxではsource .venv/bin/activateコマンド、Windowsでは.venv\Scripts\activateコマンドを事前に実行してください。有効化は、ターミナルを開いて作業を始めた最初のタイミングで一度実行すればOKです。ターミナルを立ち上げ直した場合は、再び有効化が必要になります。有効化を解除したい場合は、deactivateコマンドを実行してください。
以上がuvの基本的な使い方です。あとは、実際に使いながら必要に応じて公式ドキュメントなどで調べてみてください。本稿の以降では、その他の「uvの機能」を簡単に紹介していきます。
プロジェクトを他のユーザーと共有する場合、必要なパッケージを一括インストール(厳密には同期)したいですよね。uvでは、pyproject.tomlファイルに記述した「依存パッケージの情報」と、uv.lockファイルに記録された「固定バージョン情報」に基づいて、uv addやuv runなどのコマンド実行時に必要に応じて環境が自動的に同期(=一括インストール/更新/不要なものはアンインストール)されますが、リスト9のようにuv syncコマンドで明示的に同期することも可能です(参考ページ)。
# Pythonパッケージ情報(uv用のpyproject.toml/uv.lockファイル)と同期
uv sync
また、pipで作成したrequirements.txtファイルをそのまま使って、uvの高速性を生かしたパッケージの一括インストールも可能です(参考ページ)。具体的には、uv pip sync requirements.txtというコマンドを実行してください。ただし、この方法でインストールしたパッケージ情報はpyproject.tomlファイルやuv.lockファイルには反映されません。
pipには、標準機能ではありませんが、PythonパッケージをCLI(コマンドライン・インタフェース)ツールとしてそのまま実行できるpipxコマンドがあります(参考ページ)。
uvにも類似の機能があり、uvxコマンドでPythonパッケージをCLIツールとしてそのまま実行できます(参考ページ)。その際、CLIツールは分離された一時的な仮想環境にインストールされ、他の環境に影響を与えずに実行できます(参考ページ)。ちなみに、uvxコマンドはuv tool runコマンドのエイリアス(別名)です。
例えばリスト10は、RuffというPython用CLIツールをuvxコマンドで実行する例です。uvxコマンドは非常に手軽なので、MCPサーバーの実行などでよく活用されています。
# CLIツールのRuffを実行
uvx ruff
自作のツールを作成して実行したい場合は、基本的にプロジェクトのCLI用のエントリポイントを設定して、CLIを提供するPythonパッケージとしてビルドして公開する必要があります。筆者自身は試していないので、詳しくはリンク先をご参照ください。
重要なコマンドは、一通り紹介できたと思います。ここまでに作成したものを更新したり、削除したりしたい人も多いと思うので、その方法をシンプルに紹介していきます。
uvでは、pyproject.tomlファイルでプロジェクトの依存関係が定義されます。
uv lock --upgrade-package <パッケージ名>コマンドを実行すると、pyproject.tomlファイルの定義に基づき、uv.lockファイルに記述される該当パッケージのバージョンが最新の互換性のあるものに更新されます(参考ページ)。なお、この操作ではpyproject.tomlファイル自体の内容は変更されません。
この状態で、先ほども説明したuv syncコマンドを実行すると、uv.lockファイルの内容に基づいて、仮想環境に実際に各パッケージをインストールしたり更新したり、不要なものはアンインストールしたりしてくれます。リスト11はその例です。
# uv.lockファイルを更新(requestsパッケージを最新に)
uv lock --upgrade-package requests
# uv.lockファイルに基づき環境のパッケージを同期(=更新)
uv sync
リスト11ではrequestsライブラリが最新版に更新されます。特定のバージョンに更新したい場合は、uv lock --upgrade-package requests==2.32.3のように<パッケージ名>==<バージョン番号>の形式で指定してください。
# pandasパッケージを削除
uv remove pandas
uv removeコマンドを実行すると、該当パッケージがアンインストールされるだけでなく、pyproject.tomlファイルのdependencies設定からも該当パッケージが自動的に削除されます。同様に、uv.lockファイルからも固定バージョン情報が自動削除されます。
Python 3.13から3.14へのようにマイナーバージョンをアップグレードしたい場合は、まずuv python installコマンドで「Python 3.14の本体」をインストールした上で、次にuv python pinコマンドを使ってそのバージョン「3.14」を指定(pin)し直してください。
Pythonの古いパッチバージョン(例えば3.13.2)から最新のパッチバージョン(例えば3.13.5)へアップグレードしたい場合は、リスト13のようにuv python upgradeコマンドが使えます(参考ページ)。ただし、現在はプレビュー段階の機能なので予期しない動作をする可能性があり、お勧めはできません。
# Python 3.13のパッチバージョンを最新にアップグレード
uv python upgrade 3.13
# Python 3.12を削除
uv python uninstall 3.12
uv python uninstallコマンドで、対象バージョンのPython本体をアンインストールできます。
プロジェクトの削除は、単に該当ディレクトリを削除するだけです。.venvディレクトリを含む仮想環境も一緒に削除されます。
本稿ではpipやcondaと比較してから、uvによるPython環境構築の基本を解説してきました。pip互換の操作感を持ちながら、Rust製による爆速のパッケージ管理を実現するuvは、Python環境構築の常識を大きく変えつつあります。
もちろん多くの現場では、まだまだpipの方が主流かもしれません。しかし、最先端技術を扱う公式ドキュメントではuvを前提とした手順が増えており、今後はuvを触らざるを得なくなるのは間違いありません。だからこそ、pipとuvが混在する過渡期である今のうちに、uvに慣れて移行してしまうのが現実的だと筆者は考えます。
実際に筆者自身も、この記事を書きながらuvに乗り換えました。まだの人は、できれば今すぐ、難しければ次のプロジェクトを始めるタイミングで、uvに乗り換えましょう。この記事が、その一歩を踏み出す助けになれば幸いです。
Copyright© Digital Advantage Corp. All Rights Reserved.