uv教の侵略 ~venv教信者がuvに溺れるまで~

# 1. きっかけ
みんな大好き「からあげ」さんのこのポスト

https://x.com/karaage0703/status/1926101430219235662

試したくなりました。

結論：このSpeakerDeckを書いていただいた「MIKIO KUBO」さん、紹介していただいた「からあげ」さん、最高っす!

<br>
<br>
<br>


からあげさんはこの名著の著者のお一人です。

https://amzn.asia/d/1O3Ju1g

一度お会いしたことあるけど、サインもらい損ねた。💦

<br>
<br>
<br>

# 2. venvについて僕の過去記事
https://qiita.com/ikedachin/items/47de89ff812053e6364f

過去にはこんな記事書いてました。そう、ずっとvenvを使っていたんです。
それも自分でbashのエイリアスを書いて、バージョン違いもOKなふうにしてました。

そんな僕がゆらゆら揺れ動く事態にさせたのは、あなた！からあげさんです！（いじってみる。💦）

uvを使ってまだ一日目ですが、やはり初心者はvenv、初心者を脱却して様々なpythonバージョンを使い分ける必要が出てきたタイミングでuvへ移行で良いと思ってます。環境で悩まないことが初心者には大事なんじゃないかなと思います。（どんだけ苦労したか・・・）

<br>
<br>
<br>

# 3. MIKIO KUBOさんのSpeakerDeck

https://speakerdeck.com/mickey_kubo/pythonpatukeziguan-li-uv-wan-quan-ru-men

まじで神！

<br>
インストール等はこのまんまコピペ実行でOKデス。（mac、win11は大丈夫でした）

【追記】2015MacBook12inchに入れたubuntu24.04は以下でインストールできました。

```bash
sudo snap install astral-uv --classic
```

<br>
<br>
<br>


# 4. 僕のベストプラクティス（一つ目の方法）
まずは自分が半日色々と試行錯誤した結果のベストプラクティスを二つ紹介します。
ベスト！と言いながら二つあるけど許してん❤️
<br>


## 4.1 作業フォルダ（プロジェクト）の作成
なんでもいいので作業フォルダを作ります。
コマンドラインから`mkdir`でフォルダを作ってもいいし、`Finder`(mac)、`explore`(win)でもいいのでフォルダを作ります。
そしてbashやpowershellなどでこのフォルダに入ります。
`cd <フォルダ名>/<子フォルダ名>`でちまちま移動するか、`cd `と入力して作成したフォルダをドラッグ&ドロップします。


## 4.2 作業フォルダの初期化
```bash:pythonのバージョン指定をする初期化
uv init --python 3.11
```
ここ、かなり肝になります。使いたいpythonのバージョンはここで指定しましょう。

<br>
<br>

たとえば指定しないとどうなるかというと
```bash:pythonのバージョン指定しない初期化
uv init
```

この時に複数のファイルが作られますが、`pyproject.toml`に`requires-python = ">=3.12"`と記載されてしまいました。これだと例えば3.11の環境が作ると都度警告が出ます。なので、`uv init`の時にバージョン指定。これを忘れずに！

<br>
<br>



## 4.3 環境づくり
実はまだ悩んでますが、一旦これで。
```bash
uv venv
```
通常のvenvのイメージで作れます。
これで`.venv`フォルダが作られます。

<br>


```powershell:win
 .venv\Scripts\activate
```
```bash:mac/linux
 source .venv\bin\activate
```
この辺りは普通のvenvと同じです。仮想環境に入ります。

<br>
<br>



## 4.4 ライブラリのインストール
インストールを行うためにrequirements.txtを用意しておきます。（てきとう）
```text:requirements.txt
Django
numpy
pandas
matplotlib
```

<br>


```bash
uv add -r requirements.txt
```
これでライブラリのインストールができます。
ライブラリ一つ一つも簡単で、`uv add numpy`みたいに書けばいいだけです。

<br>
<br>


## 4.5 実行
ちょっとだけ実行方法が違います。いや、違いません。どっちやねん。
多分公式の実行方法はこれ

<br>

```bash
uv run main.py
```
いままでは`python main.py`でしたね。ま、このくらいの変化は良いっすよね。
これであなたもuv教！！！

<br>
<br>

# 5. 僕のベストプラクティス（二つ目の方法）
「おい、今まで環境フォルダに名前付けてたやんけ！それも`.venv`って隠しフォルダにする意味も分からんって言うてたやんけ！」と言われそうですね。
ということで、環境フォルダに名前を付ける方法をやっていきます。

初期化までは飛ばして、仮想環境フォルダを作るところから簡単に紹介していきます。
（ここからはWindowsでの検証結果だけかきます。めずらしく、今日はWindows使っているので。ｗ）

<br>


```bash
uv venv proj_env
# uv venv <環境名>
```
実は、環境フォルダの名前を指定するのは簡単にできるんです。
通常のvenvとほぼ同じというかむしろ楽。

<br>


```powershell:win
proj_env/Script/activate
```
仮想環境に入っていきましょう。先ほどとの違いは環境ファイル名が違うだけです。

<br>
<br>

```bash
uv add -r requirements.txt --active
```
ここから少し工夫が必要です。`--active`をつける必要があるのです。
この`--active`を忘れるとどうなるかと言うと、**勝手に`.venv`が作られてしまいます。**

この小さなミスで余分な容量を食うのはいただけません。
警告で止まればいいんだけど・・・（なぜこの仕様にした？）

<br>
<br>



```bash
uv run main.py
```
さて実行・・・と気軽に実行してはいけません。ｗ
これで実行すると、またも.venvが作られてしまい、その環境で実行されてしまいます。
だからなぜこの仕様なんだ？？

<br>


```bash
uv run　--active main.py
```
実は`--active`を付ける必要があります。結構めんどくさい。
そこで従来の方法でやってみます。

<br>



```bash
python main.py
```
あ、今まで通りじゃん。w
なぜ`uv run`があるんだろ？

ということで、仮想環境フォルダを`.venv`から変えた場合、ひとまず普通に`python main.py`で実行するくらいで良いのかもしれません。
（何か困りごとが出てきたら追記します。）

<br>
<br>




# 6. 失敗事例
自部は初期化時（uv init)にpythonのバージョンを指定しわすれて、よくわからないことになってしまいましたので紹介します

<br>


```bash
uv init
```
こうすると自動生成されるpyproject.tomlはこうなります。

<br>


```text:pyproject.toml
[project]
name = "test_proj"　
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = []
```
pythonのバージョンが3.12以上が指定されちゃうようです。

<br>


続けて仮想環境を作ります。ここでpythonのバージョン指定してみます。
```bash
uv venv proj_env --python 3.11
# warning: The requested interpreter resolved to Python 3.11.9, which is incompatible with the project's Python requirement: `>=3.12`
```
警告を出しながら、環境ができちゃう
そこで、仮想環境に入ってpythonのバージョンを確認してみましょう。

<br>



```PowerShell
proj_env\Scripts\activate
(proj_env) PS <** 秘匿 **>/test_proj> python -V
Python 3.11.9
```
ちゃんとできてる

<br>


仮想環境を作った時の警告を無視してライブラリインストールすると


```bash
uv add -r requirements.txt
# warning: `VIRTUAL_ENV=proj_env` does not match the project environment path `.venv` and will be ignored; use `--active` to target the active environment instead
# Using CPython 3.12.10
# Creating virtual environment at: .venv
```
3.12で.venv環境作られちゃう。💦
実は、`--active`コマンドを付けても同様に3.12になっちゃいます。
<br>
<br>

じゃ、.venvで環境フォルダを作ったらどうなるか試してみました、同じ挙動になりました。
なので、tomlファイルのバージョン指定はかなり強力です。よって、`uv init`時にしっかりバージョン指定してあげることが一番大事だと思います。

<br>
<br>
<br>




## 気を付けるところのまとめ
- uv initするときにpythonのバージョンを指定するのを忘れない
指定しないと、逆に3.12が指定されてしまうので警告が出る
- 環境フォルダを.venvから変えた場合はuv add時に--activeを忘れない
忘れると`.venv`を勝手に作られる
- 環境フォルダを.venvから変えた場合はuv run時に--activeを忘れない
忘れると`.venv`を勝手に作られる
- 環境フォルダを.venvから変えた場合はpython <ファイル名.py>で実行すると楽
- ここまで書いてないけど、ipynbで使う時は`uv add ipykernel`を忘れずに
vscodeだと「ipykernelをインストールしないとノートブック形式はつかえんよ。インストールする？」って聞かれる。
でも、YESとしてもpipがみつからないよ～と怒られてしまいます。なので手打ちでipykernelをインストールしてください。

<br>
<br>



# 7. おわりに
こうやって、venv教の信者はuv教に鞍替えしたのです。
しかしながら、この世界に入ってきたばかりの人にはvenv教をお勧めすることに変わりはありません。なぜなら、最初はpythonのバージョンはあまり気にしなくていいからです。
それよりも目的に合わせた仮想環境をきちんと作るといいうことに慣れたほうが良いと思います。

いずれ、このリポジトリを動かすには3.10じゃないとだめ！みたいな話が出てきます。その時にuv教の門をたたいても決して遅くないと思います。

こうしてvenv教信者だった私はuv教への入信をすることになりました。
ちゃんちゃん