uvで始めるPythonプロジェクト管理

## 想定読者

- モダンなPythonのプロジェクト管理に興味がある人
- 中級者未満


## はじめに

先日Pythonのプロジェクト管理ツールであるRyeの導入記事を書きました。

https://qiita.com/The_Past_of_Dice/items/418c1d205dd7463503bd

似たようなPythonプロジェクト管理ツールで、さらに高速と言われているuvというものがあるらしいので、今回はこちらを試してみようと思います。

下記が公式サイトなので、詳細は公式サイトを見てください。上級者の方は、公式サイトを読んで頂いた方が良いと思います。

https://docs.astral.sh/uv/

## 環境

MacBookPro
Apple M3 Max
macOS Sequoia15.0.1

## uvのインストール

uvのインストールは公式サイトに載っていますが、インストール方法がいくつかあります。


公式で推奨されている方法です。基本的には下記コマンドを使っておけば大丈夫です。
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```

下記コマンドの場合、開発環境ごとに異なるバージョンのuvを使用したい場合に主に使用することになります。
```bash
pip install uv
```

Mac向けの選択肢で、私が調べた限りあまり差はありませんでした。
特にこのコマンドであるメリットもないかなと。
```bash
brew install uv
```

インストールが完了したら、パスを通しましょう。
pipでインストールした場合は、パスを通す必要はないと思います。
```bash
source $HOME/.cargo/env
```

インストールされたか確認するついでに最新版にアップデートしてしまいます。
```bash
uv self update
```
ここまでエラーが出なければ、uvを使うことができる状態です。

## uvでプロジェクト管理をする

既存のプロジェクトでuvを使用する場合は、プロジェクトのルートディレクトリで下記コマンドを実行します。
```bash
uv init
```
なんやかんや動いて。
hello.py
pyproject.toml
.python-version
が勝手に作成された。

続きまして、現在使用可能なPythonのバージョンを調べます。
```bash
$ uv python find
/Library/Frameworks/Python.framework/Versions/3.12/bin/python3
```

現在は3.12のバージョンになっているようです。これは私の環境のPythonと同じになっていると思います。
せっかくなので、最新版を使いたい。ということで、uvで使用可能なPythonのバージョンを調べます。
```bash
$ uv python list
cpython-3.13.0-macos-aarch64-none     <download available>
cpython-3.12.7-macos-aarch64-none     <download available>
cpython-3.12.6-macos-aarch64-none     /opt/homebrew/opt/python@3.12/bin/python3.12 -> ../Frameworks/Python.framework/Versions/3.12/bin/python3.12
cpython-3.12.0-macos-aarch64-none     /usr/local/bin/python3.12 -> ../../../Library/Frameworks/Python.framework/Versions/3.12/bin/python3.12
cpython-3.12.0-macos-aarch64-none     /usr/local/bin/python3 -> ../../../Library/Frameworks/Python.framework/Versions/3.12/bin/python3
cpython-3.12.0-macos-aarch64-none     /Library/Frameworks/Python.framework/Versions/3.12/bin/python3.12
cpython-3.12.0-macos-aarch64-none     /Library/Frameworks/Python.framework/Versions/3.12/bin/python3 -> python3.12
cpython-3.11.10-macos-aarch64-none    <download available>
cpython-3.10.15-macos-aarch64-none    /opt/homebrew/opt/python@3.10/bin/python3.10 -> ../Frameworks/Python.framework/Versions/3.10/bin/python3.10
cpython-3.10.15-macos-aarch64-none    <download available>
cpython-3.10.5-macos-aarch64-none     /usr/local/bin/python3.10 -> ../../../Library/Frameworks/Python.framework/Versions/3.10/bin/python3.10
cpython-3.10.5-macos-aarch64-none     /Library/Frameworks/Python.framework/Versions/3.10/bin/python3.10
cpython-3.10.5-macos-aarch64-none     /Library/Frameworks/Python.framework/Versions/3.10/bin/python3 -> python3.10
cpython-3.9.20-macos-aarch64-none     /opt/homebrew/opt/python@3.9/bin/python3.9 -> ../Frameworks/Python.framework/Versions/3.9/bin/python3.9
cpython-3.9.20-macos-aarch64-none     <download available>
cpython-3.9.6-macos-aarch64-none      /Applications/Xcode.app/Contents/Developer/usr/bin/python3 -> ../../Library/Frameworks/Python3.framework/Versions/3.9/bin/python3
cpython-3.9.5-macos-x86_64-none       /usr/local/bin/python3.9 -> ../../../Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9
cpython-3.9.5-macos-x86_64-none       /usr/local/bin/python -> /usr/local/bin/python3.9
cpython-3.9.5-macos-x86_64-none       /Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9
cpython-3.9.5-macos-x86_64-none       /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 -> python3.9
cpython-3.8.20-macos-aarch64-none     <download available>
pypy-3.10.14-macos-aarch64-none       <download available>
pypy-3.9.19-macos-aarch64-none        <download available>
pypy-3.8.16-macos-aarch64-none        <download available>
```

現在最新の3.13.0が使用できるのでインストールします。
```bash
$ uv python install 3.13
Searching for Python versions matching: Python 3.13
Installed Python 3.13.0 in 3.01s
 + cpython-3.13.0-macos-aarch64-none
```

インストールが完了したらRyeと同じくpinでPythonのバージョンを指定します。
```bash
$ uv python pin 3.13
Updated `.python-version` from `3.12` -> `3.13`
```

### ライブラリの追加
ライブラリの追加は`uv add`でできます。

```bash
$ uv add pytest
Using CPython 3.13.0
Creating virtual environment at: .venv
Resolved 6 packages in 287ms
Prepared 4 packages in 113ms
Installed 4 packages in 6ms
 + iniconfig==2.0.0
 + packaging==24.1
 + pluggy==1.5.0
 + pytest==8.3.3
 ```

ライブラリを追加した後は`uv sync`で仮想環境に変更を同期させます。

```bash
uv sync
```
他の大まかなコマンドは下記のようになっています。
この辺は公式ドキュメントに詳しく書かれています。
何か変更をしたら`uv sync`を忘れないようにしましょう

```uv init``` 新しい Python プロジェクトを作成します。
```uv add``` プロジェクトに依存関係を追加します。
```uv remove``` プロジェクトから依存関係を削除します。
```uv sync``` プロジェクトの依存関係を環境と同期します。
```uv lock``` プロジェクトの依存関係のロックファイルを作成します。
```uv run``` プロジェクト環境でコマンドを実行します。
```uv tree``` プロジェクトの依存関係ツリーを表示します。

### 実行

uvの環境で実行したい場合は`uv run`で実行できます。
例
```bash
uv run pytest
```

## まとめ

uvを実際に使ってみると、早くて快適です。
機能的にも現状不満はないです。
Pythonのバージョンと仮想環境を一緒に管理できるので初心者向きだと思います。
公式ドキュメントも日本語はありませんが充実しているので、ブラウザの翻訳機能を使えば十分に読めます。
Ryeに続き、uvにも触れてしまったので、この辺の違いとかを整理したいと思っています。
ではでは

Ryeの使い方は下記から、どうぞ。

https://qiita.com/The_Past_of_Dice/items/418c1d205dd7463503bd