はじめに
銃を抜いたからには 命を懸けろよ、nikkieです。
uvを試したところ、「思ってたのと、違う!」となった(=私が誤解していた)点のメモ書きです。
学び:uv付けたならuv付け通せよ(uvカットはできません)
目次
- はじめに
- 目次
- 前提:Python Monthly Topicsより、uv使ってみよう
- uvで仮想環境を作ったら、続くコマンドにもuvを付け続ける
- uvが作る仮想環境は、venvが作る仮想環境と同じと考えてはいけない
- 終わりに
前提:Python Monthly Topicsより、uv使ってみよう
venv + pip と uv の比較記事です1。
uvの速度について言及されています。
python -m venv
vs.uv venv
pip install
vs.uv pip install
uvで仮想環境を作ったら、続くコマンドにもuvを付け続ける
% 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できませんでした。
(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 venv
・uv pip install
を使っていくことになるのですね。
uvのソースコードをちょっと覗いた感じ、Pythonの仮想環境やpipの動きをRustで再実装している印象を受けました(uv venv
7やuv pip install
8)。
Python実装のツールを使わずにRustに置き換えているから速いという理解です。
一方、再実装の中では完全な互換性をもたせない方針9のようで、今回経験したようにPythonの仮想環境の知識をそのまま適用できない点もあるようです(ゼロリセット!)。
uv pip
は、pip
そのものやそのラッパーではないのだと思います。
pip
と近い振る舞いをするように実装されているだけで、uvの仮想環境にpip
はありません。
- 読んで気になった点のアウトプット ↩
-
brew install uv
https://github.com/astral-sh/uv/tree/0.1.31?tab=readme-ov-file#getting-started↩ - Virtual environments by default https://github.com/astral-sh/uv/blob/0.1.31/PIP_COMPATIBILITY.md#virtual-environments-by-default↩
- 奇しくも私も.venvという名前に行き着きました ↩
- venvでも、できらあ! ↩
-
uv venv --seed
で「Install seed packages (pip
,setuptools
, andwheel
) into the virtual environment」とのことです。でもどんなユースケースで使うんだろ?↩ - ここから https://github.com/astral-sh/uv/blob/0.1.31/crates/uv/src/commands/venv.rs↩
- ここから https://github.com/astral-sh/uv/blob/0.1.31/crates/uv/src/commands/pip_install.rs↩
-
途中でも引いた https://github.com/astral-sh/uv/blob/0.1.31/PIP_COMPATIBILITY.md 参照。私の気持ちも置いときます
↩Pythonの仮想環境とインストーラを置き換えに来ているuv。
— nikkie / にっきー (@ftnext) 2024年4月14日
リポジトリに見つけた互換性の記載読んでみましたhttps://t.co/lRYXg5jFx9
>uv is not intended to be an exact clone of pip
pipとpip-toolsを使ったワークフローを置き換えようとしてるけど、速いを謳うだけじゃなく経緯に敬意がのびしろ感