uvが良いので今日から暫く使ってみます

たまたまこちらのブログが目に入りました。

uvというPythonのパッケージ管理を行うツールです。

https://astral.sh/blog/uv-unified-python-packaging

もともとはpipやpipxの代替として2月にリリースされました。（[ブログ](https://astral.sh/blog/uv)）

今回の発表では、PythonプロジェクトやPython自体の管理もできるようになりましたとのことです。

:::note
pip、pip-tools、pipx、poetry、pyenv、virtualenvの機能が単一バイナリで提供されているよ！というウリ！！
:::


代替品というだけではなく、Rustで記述されているため処理速度が早いという特徴があります。（10-100x fasterらしい）

---

[公式ドキュメント](https://docs.astral.sh/uv/)のIntroductionをやってみました。

## 検証環境

Pythonが古い環境で試そうと思いまして、devcontainerでUbuntu 20.04.6 LTS (Focal Fossa)の環境を作りました。

```shell:Shell
cat /etc/os-release
```
```
NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.6 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```

導入されているPythonのバージョンは`3.8.10`でした。

```shell:Shell
python3 --version
```
```
Python 3.8.10
```

:::note
Ubuntu 20.04.6 LTSは、aptでインストールできるPythonは3.9までで、3.10以降はインストールできませんが、uvを使うとインストールできました
:::


## uvをインストール

コマンド一発です

```shell:Shell
curl -LsSf https://astral.sh/uv/install.sh | sh
```

パスに追加し、シェルに反映

```shell:Shell
echo 'source $HOME/.cargo/env' >> ~/.bashrc
source ~/.bashrc
```

コマンド確認

```shell:Shell
uv --version
```
```
uv 0.3.0
```

## 機能紹介

### プロジェクトマネジメント

:::note
Poerty的な機能です
:::

プロジェクトを新規作成します。

```shell:Shell
uv init example
```
```
Initialized project `example` at `/workspaces/uv/example`
```

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

```shell
example
├── pyproject.toml
├── README.md
└── src
    └── example
        └── __init__.py

2 directories, 3 files
```

```yaml:pyproject.toml
[project]
name = "example"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = []

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
```

ライブラリーを追加する場合は`uv add`コマンドです。

```shell:Shell
cd example
uv add langchain langchain-aws
```

ライブラリーを追加すると、`pyproject.toml`のdependencies に追加されます。

```diff_yaml:pyproject.toml
  [project]
  name = "example"
  version = "0.1.0"
  description = "Add your description here"
  readme = "README.md"
  requires-python = ">=3.12"
+ dependencies = [
+     "langchain>=0.2.14",
+     "langchain-aws>=0.1.16",
+ ]
  
  [build-system]
  requires = ["hatchling"]
  build-backend = "hatchling.build"
```

### ツールマネジメント

:::note
pipx的な機能です
:::

コマンドラインツールを直接実行できる機能です。[pycowsay](https://github.com/cs01/pycowsay)を呼び出す例です。

```shell:Shell
uvx pycowsay "hello world!"
```
```

  ------------
< hello world! >
  ------------
   \   ^__^
    \  (oo)\_______
       (__)\       )\/\
           ||----w |
           ||     ||

```


### Pythonマネジメント

:::note
pyenv的な機能です
:::

指定したバージョンのPythonをインストールします。

```shell:Shell
uv python install 3.10 3.11 3.12
```
```
Searching for Python versions matching: Python 3.10
Searching for Python versions matching: Python 3.11
Searching for Python versions matching: Python 3.12
Installed 3 versions in 6.99s
 + cpython-3.10.14-linux-x86_64-gnu
 + cpython-3.11.9-linux-x86_64-gnu
 + cpython-3.12.5-linux-x86_64-gnu
```

指定したバージョンのPythonを起動するには`uv run`コマンドのパラメーターでPythonのバージョンを指定します。

* Python 3.10を実行
    
    ```shell:Shell
    uv run --python 3.10 -- python --version
    ```
    ```
    Python 3.10.14
    ```

* Python 3.11を実行

    ```shell:Shell
    uv run --python 3.11 -- python --version
    ```
    ```
    Python 3.11.9
    ```

* Python 3.12を実行

    ```shell:Shell
    uv run --python 3.12 -- python --version
    ```
    ```
    Python 3.12.5
    ```

ただ、プロジェクトの場合は、自動で必要なバージョンのPythonが検知してインストールされます。

仮想環境を構築する`uv venv`コマンドを実行すると、pyproject.tomlのrequires-pythonを指定に従って自動でインストールされます。

```shell:Shell
uv venv
```
```
Using Python 3.12.5
Creating virtualenv at: .venv
Activate with: source .venv/bin/activate
```

```shell:Shell
source .venv/bin/activate
python --version
```
```
Python 3.12.5
```

:::note
インストールされるPythonはコミュニティでメンテナンスされている[Python Standalone Builds](https://github.com/indygreg/python-build-standalone)とのことです。（[参考](https://docs.astral.sh/uv/guides/install-python/#getting-started)）

簡単にインストールされますが、出どころはしっかり気にしておくと良いと思います。
:::


#### Pyenvの場合

Pyenvの場合、ソースコードからビルドしてインストールを行うので、ビルドのための環境構築が必要、ビルドに時間がかかるという問題がありました。uvの場合は、数秒で導入が完了します。

```shell:Shell
## pyenvをインストール
curl https://pyenv.run | bash

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"

## Pythonのビルドのための環境構築
sudo apt update
sudo apt install -y \
  build-essential \
  libssl-dev \
  zlib1g-dev \
  libbz2-dev \
  libreadline-dev \
  libsqlite3-dev \
  curl \
  git \
  libncursesw5-dev \
  xz-utils \
  tk-dev \
  libxml2-dev \
  libxmlsec1-dev \
  libffi-dev \
  liblzma-dev

## Pythonをインストール（ビルドを行うので時間がかかる）
pyenv install 3.12

## Pythonを利用する
pyenv shell 3.12.5
python --version
```

## まとめ

とても使いやすいと感じました。今日から暫く使ってみようと思います。

CLIコマンドも豊富ですし、ドキュメントが整理されていてとても見やすいです。

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