nikkie-ftnextの日記

イベントレポートや読書メモを発信

uvお試し記:uv venvで作った仮想環境でpip installしてはいけません。uv pip installしましょう

はじめに

銃を抜いたからには 命を懸けろよ、nikkieです。

uvを試したところ、「思ってたのと、違う!」となった(=私が誤解していた)点のメモ書きです。
学び:uv付けたならuv付け通せよuvカットはできません)

目次

前提:Python Monthly Topicsより、uv使ってみよう

venv + pip と uv の比較記事です1
uvの速度について言及されています。

  • python -m venv vs. uv venv
  • pip install vs. uv pip install

uvで仮想環境を作ったら、続くコマンドにもuvを付け続ける

macOSbrewで入れました2

% uv --version
uv 0.1.31

📌こちらの使い方をしていきましょう(コマンドにはuvを付け続ける)

% uv venv
% uv pip install kojo-fan-art

(仮想環境を有効にしていないですが、)これでuvが作った仮想環境にインストールできます3

% source .venv/bin/activate
(work) % kojo-day

(work) % python -q
>>> import the_solitary_castle_in_the_mirror

uvが作る仮想環境は、venvが作る仮想環境と同じと考えてはいけない

uvが作る仮想環境とvenvが作る仮想環境を同じと誤解したために小さくハマりました。

uv venvは仮想環境の有効化を促します4
(私の環境ではpyenvが管理するPythonが選択されています)

Using Python 3.10.9 interpreter at: /.../.pyenv/versions/3.10.9/bin/python3
Creating virtualenv at: .venv
Activate with: source .venv/bin/activate

私がやってしまったのは、有効化してからのpip install(俺みたいになるな!)

% rm -rf .venv
% uv venv
% source .venv/bin/activate

(work) % pip install kojo-fan-art
(work) % python -q
>>> import the_solitary_castle_in_the_mirror
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'the_solitary_castle_in_the_mirror'

(uvの仮想環境を有効にして)pip installしたのにimportできませんでした。

実は、uvの仮想環境にはpipがない5んですね6

(work) % python -m pip list
/.../.venv/bin/python: No module named pip

なので、pip install kojo-fan-artしたpipは、仮想環境の外のpipなのです!

(work) % which pip
/.../.pyenv/shims/pip

現在有効にしているuv製仮想環境にインストールできていなかったので、importできなかったわけです。
学んだのは、uvコマンドで仮想環境をはじめたら、依存ライブラリのインストールではuvを付け続けるということです

終わりに

uvをvenv(やvirtualenv)同様の仮想環境と考えたために小さく躓いた点を記録しました。
uvを使うときは、venvなどのことは一度忘れuv venvuv pip installを使っていくことになるのですね。

uvのソースコードをちょっと覗いた感じ、Pythonの仮想環境やpipの動きをRustで再実装している印象を受けました(uv venv7uv pip install8)。
Python実装のツールを使わずにRustに置き換えているから速いという理解です。

一方、再実装の中では完全な互換性をもたせない方針9のようで、今回経験したようにPythonの仮想環境の知識をそのまま適用できない点もあるようです(ゼロリセット!)。
uv pipは、pipそのものやそのラッパーではないのだと思います。
pipと近い振る舞いをするように実装されているだけで、uvの仮想環境にpipはありません。


  1. 読んで気になった点のアウトプット
  2. brew install uv https://github.com/astral-sh/uv/tree/0.1.31?tab=readme-ov-file#getting-started
  3. Virtual environments by default https://github.com/astral-sh/uv/blob/0.1.31/PIP_COMPATIBILITY.md#virtual-environments-by-default
  4. 奇しくも私も.venvという名前に行き着きました
  5. venvでも、できらあ!
  6. uv venv --seedで「Install seed packages (pip, setuptools, and wheel) into the virtual environment」とのことです。でもどんなユースケースで使うんだろ?
  7. ここから https://github.com/astral-sh/uv/blob/0.1.31/crates/uv/src/commands/venv.rs
  8. ここから https://github.com/astral-sh/uv/blob/0.1.31/crates/uv/src/commands/pip_install.rs
  9. 途中でも引いた https://github.com/astral-sh/uv/blob/0.1.31/PIP_COMPATIBILITY.md 参照。私の気持ちも置いときます