パッケージ管理ツールuvでデータ分析環境を構築する

## はじめに
この記事ではPythonのパッケージ管理ツールである[uv](https://github.com/astral-sh/uv)で仮想環境を構築し、VSCode上でipynbファイルを実行できるようにするまでの流れをまとめる。前提としてuvは ver0.4.6 インストール済み、Windows11環境での作業となる。今回はデータ分析や機械学習モデルの開発でよく使われるpandasについて、ipynbファイルで以下のコードを実行してpandasのバージョンを表示させることを目標にする。
```py
import pandas as pd
pd.__version__
```
## 1. 仮想環境の構築
早速データ分析ができる環境を作っていきたい。まずは分析環境となるプロジェクトと、そこで使う仮想環境をuvコマンドで作成しよう。今回は`my_python`と名付けたディレクトリに`env1`というプロジェクトを作りたいので、以下のコマンドを`my_python`で実行する。
```
uv init env1
```
すると、`env1`というディレクトリと
- `.python-version`
- `hello.py`
- `pyproject.toml`
- `README.md`

が生成される。（まだuvでPythonをインストールしていなければ最新のバージョンがインストールされる。）
さて、ここから仮想環境を作る方法は2通りある。
### i) pyファイルを実行する
先ほど生成された`hello.py`、もしくは自身でpyファイルを作成してそれをuvコマンドで実行するという方法。uvでpyファイルを実行するコマンドは以下の通り。
```
uv run hello.py
```
これを`env1`に移動して実行すると、`.venv`と`uv.lock`が生成される。`uv.lock`はインストールしたパッケージ等が記載されるファイルだが、詳細は割愛。

### ii) uvコマンドで直接作る
もちろんuvコマンドで直接作ることもできる。その場合は
```
uv venv <環境名>
```
とすると入力した環境名で`.venv`が生成される。`uv.lock`は生成されないが、後でパッケージをインストールした段階で生成されるので、どのみち気にしなくてよい。<br>
これで分析環境となるプロジェクト`env1`と仮想環境`.venv`を作成できた。

## 2. 仮想環境内の操作
### 仮想環境の起動
ベースになるプロジェクトを作ったので、`env1`に入って仮想環境を起動しよう。Powershellで
```:powershell
. ./.venv/Scripts/activate
```
もしくは
```:powershell
./.venv/Scripts/activate
```
とコマンドを打つと仮想環境を起動するスクリプトが走る。画像のように`(env1)`と表示されれば成功となる。

![スクリーンショット 2024-10-10 222631.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077345/d20ac312-40f8-d276-2de5-12eed44fa529.png)

仮想環境を終了する場合は、
```
deactivate
```
と打つ。


### ライブラリのインストール
さて、ここまでの手順で初めて作った環境ならばまだライブラリは何もインストールされていないはずである。今どんなライブラリが入っているかは
```
uv pip list
```
で確認できるので、コマンド実行後に何も表示されないことを一応確認してほしい。今回はpandasを使うことが決まっているのであらかじめ入れておこう。
```
uv add pandas
```
で最新バージョンをインストール、もしくは
```
uv add "pandas==2.1.4"
```
とやればバージョンを指定してインストールできる。ちなみに削除したい場合は
```
uv remove pandas
```
となる。
また、ipynbファイルを使うのでipykernelも入れておく。（`uv add ipykernel`）

### Pythonバージョンの変更
使いたいライブラリが仮想環境のPythonのバージョンに対応していないことはよくある。現在のPythonのバージョンを知りたいなら`python -V`等で確認できる。また、
```
uv python list
```
で現在どのバージョンがインストールされているか確認できる。

![スクリーンショット 2024-10-10 231520.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077345/81a82bd1-d6bb-ce70-9792-19fcb9957548.png)

画像では3.12がインストールされている。例えば3.10もインストールしたい場合は
```
uv python install 3.10
```
と打てばインストールされる。

![スクリーンショット 2024-10-10 232212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077345/119c6efb-9696-e222-92ff-3a09f90e44fd.png)

そのうえで、3.10に切り替えたいなら
```
uv python pin 3.10
```
とすれば切り替わる。
ただし、プロジェクト作成時のバージョンが切り替えたいバージョンより新しいとき、`pyproject.toml`を書き換えなくてはならない。今回は特にバージョン指定せずプロジェクトを作ったので、`pyproject.toml`のバージョンに関する記述は以下のようになっている。
```pyproject.toml
・・・

requires-python = ">=3.12"

・・・
```
これを`requires-python = ">=3.10"`と書き換えることで、プロジェクトは3.10以上のバージョンにも切り替えられるようになる。

:::note warn
[この記事](https://gihyo.jp/article/2024/09/monthly-python-2409#:~:text=%E3%81%9F%E3%81%A0%E3%80%81%E7%8F%BE%E6%99%82%E7%82%B9%E3%81%A7%E3%81%AF%E3%80%81uv%E3%81%A7Python%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E3%8これを2%82%E3%80%81%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7python%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%81%AB%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E3%81%93%E3%81%AE%E6%A9%9F%E8%83%BD%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AF%E5%B0%86%E6%9D%A5%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%A7%E4%BA%88%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%82%8B%E3%82%88%E3%81%86%E3%81%A7%E3%81%99%E3%80%82uv%20run%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%8B%E3%80%81uv%20venv%E3%81%A7%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E5%88%A9%E7%94%A8%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86%E3%80%82)の通り、現在uvでPythonをインストールしてもグローバルでは使えない。（仮想環境を立ち上げずにpythonコマンドが使えるようにはならない）
:::

## 3. カーネルの選択
最後に分析で使うカーネルを選択する。選択の前に分析で使うipynbファイルを作成しておく。今回は`env1/sample.ipynb`とした。
手順としては、`sample.ipynb`を開いた状態で
1. VSCodeの右上にある「カーネルの選択」をクリック
2. 出現したタブから、作成したvenvを選択する（`env1\.venv\Scripts\python.exe`）

![スクリーンショット 2024-10-12 204808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077345/736420ce-2aa4-b572-2564-ddcdd1cb06b4.png)

なお、どのカーネルが選択されているかは
```py
import sys
sys.executable
```
で確認できる。

これで分析を始める準備は整った。冒頭で書いたように、実際に分析が始められそうかをライブラリのバージョンを表示させて分析準備を完了させよう。
```py
import pandas as pd
pd.__version__
```

![スクリーンショット 2024-10-14 014356.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077345/16244d8c-a94e-bfd4-d82f-f56f69674639.png)


### ※カーネル選択時の注意点
初めて環境を作成した後に「カーネルの選択」をクリックすると、開いたタブに今作った`venv`が出てこないことがある。しかも、検索窓に使いたいカーネルのパス（例えば`env1\.venv\~~`）と入力しても表示されない。

原因はVSCodeが現在開いているフォルダをワークスペースとして認識しているからとなる。その時使いたい環境を直下にして（今回は`env1`）VSCodeを開きなおすことで、`env1`下にあるさっき作成した`venv`を選択できるようになる。なお、一度選択して使ってしまえば履歴から選べるようになるので初回のみの注意事項となる。
- `my_python`を開いている場合
![スクリーンショット 2024-10-14 005413.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077345/ac8c9e30-412a-fa97-8957-c0b6a5bac039.png)

- `env1`を開いている場合（`img`は筆者作成）
![スクリーンショット 2024-10-14 005745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077345/ec09a737-215f-5bcf-3eb7-6d5ef4b80c54.png)
VSCodeで`env1`を直接開けば選択できる。



## おわりに
今回はuvでデータ分析環境を構築する方法を最低限必要なuvコマンドとともに紹介した。まだまだ便利な機能がたくさんあるので、ぜひ調べて使ってみてほしい。uvはpipやcondaよりライブラリのインストールが早く、環境管理も（筆者にとっては）わかりやすい。今後のスタンダードになっていくのではないかと思っている。



## 参考
- [uv](https://docs.astral.sh/uv/)
- [uvはPythonのバージョン管理とパッケージ管理のベストプラクティス](https://zenn.dev/nobkat/articles/004uv-package-management-tool)
- [uvだけでPythonプロジェクトを管理する](https://zenn.dev/turing_motors/articles/594fbef42a36ee)