WindowsでのPython環境について
WindowsでのPython環境はこれまでMiniconda(Anaconda)を利用してきました.個人的利用では正直なところ、とくに問題ありません.ただ、現在Minicondaを利用する理由がPythonとNodejsのバージョン管理にしか使っておらず、そろそろ別のに乗り換えるいい機会かなと思いました.そこで、いくつか試してみた結果を記録しておきます.
結論から言うと、やはりMinicondaが楽かなと思います.情報量も多いですし.ただ、最終的に py + winget + pip/uv + volta という環境になりました. まずは他に試したものからまとめていきます.
pyenv + poetry
Windowsだと pyenv-win を使います.インストールや初期設定など若干手間では ありますが、導入に関しては問題ありませんでした.ただ、pyenv経由でインストールしたpythonの動作が公式インストーラでのpythonや他のpythonバージョン管理での実行バイナリと挙動が違っていました.もちろん、それぞれ同じバージョンなのですが、ビルドはそれぞれ違います.pyenvでインストールしたバイナリだと結果がエラーになってしまう部分があり、こちらの環境で問題が発生しました.具体的には "-c" コマンドを空で実行したときに返ってくる結果が異なります.こちらのコードを調整すれば対応できますが、クローンしたプロジェクトで発生しており、ちょっと面倒なため、残念ながら不採用となりました.pyenvそのものはとくに問題なかったのですけどね.あと、poetryに関してもとくに問題ないと思います.しかし、uv があまりにも速かったのでそちらにしました.
Rye
Rye はPythonのバージョン、およびパッケージ、プロジェクトを管理できるツールです.これから新規にやっていくならありかなと思いますが、試してみて思ったのがすでにある環境への対応が難しいです.とくにpipコマンドが隠蔽されてしまうのが致命的で、環境の構築など簡単に実行できるスクリプトなどが用意されていることも多く、こういったスクリプトがまったく動かなくなります.ちなみに、pipコマンドが隠蔽されることは別に悪いことではなく、rye経由のパッケージ管理に集中できます.
uv
uv はパッケージとプロジェクト管理ツールです.Pythonのバージョン管理もあります.
とにかく仮想環境の構築が速いです.Ryeも標準でuvを使うようになっています.使い方も uv pip ...
と pip に準拠した形になっているので移行しやすいです.
非常に魅力的なツールではありますが、まだまだ実験的な機能が多く、安定するには時間がかかるかもしれません.
また、pipでインストールすると問題なかったものが uv だと上手く動作しなかったことが1度だけありました.依存解決の仕方が違うようなのでそういったことが起こることがあるようです.ただ、それでも仮想環境の構築やパッケージのインストールが速いので、とりあえず uv で構築して、問題が起きたら pip にするようにしています.
ちょっと気になっているのは仮想環境のフォルダが .venv
固定ということです.個人的には venv
にしたいんですよね.これを逆に利用して venv
なら pip 、.venv
なら uv で管理しているという見分けができるようにしています.
uvは仮想環境を作成するvenv
コマンドで名前を指定できます.ですから、venv
という名前で仮想環境を作れますが、これは pip
コマンド用になります.uv の sync
コマンドなどは .venv
ディレクトリを参照します.venv
というフォルダがあっても、仮想環境をアクティベートしている状態でも .venv
ディレクトリがなければ作成します.環境変数 VIRTUAL_ENV
を参照するなどの対応は議論はあるものの対応はされていないようです(#5229, #6612).シンボリックリンクを作って対応するのもありなんですが、venv
, .venv
両方存在するように見えてしまうので避けたいですね.(片方は隠しディレクトリになるのであまり気にならないかもしれませんが)
py
py はPythonランチャーのことで、公式インストーラを使うとインストールされます.py はインストールされているPythonのバイナリを実行時に指定できます. なので、複数のバージョンをインストールして py でバージョンを 切り替えて使うということになります.各バージョンについては winget を使うことで簡単にインストールできますので、py+winget でPythonのバージョン管理ができます.また、一部のWindowsアプリはPythonによるスクリプト実行ができるのですが、グローバルにインストールしていると設定が楽だったりします.
py + winget + pip (uv)
ということで、最終的に py + winget で python のバージョン管理を、pip/uv でパッケージ管理をするようになりました.とりあえず、ローカルにある環境はほとんど Miniconda から移行できました.ちなみに基本的に pyproject.toml に依存関係をまとめて uv を使ったり、pip を使う場合は uv で pyproject.toml から requirements.txt を生成して使うという形になります.あと、パッケージの依存関係を調べるのに uv pip tree
コマンドが使えるので便利です.また、poetry も使ってもいいかもしれません.それはもうちょっと試してみないとわからないです.
環境は移行したものの、Miniconda よりも良くなったというところはとくにないので、Miniconda(Anaconda)を使ってもいいと思います.py+winget の部分が Miniconda になるだけです.とりあえず、どちらでも好きな方で問題ないという認識です.
後述するVoltaを採用することで,より柔軟性が増しました. PythonとNodejsを別々に,そしてしっかりと管理できるようになったので,Miniconda(Anaconda) よりかは若干やりやすくなった感じがします.
Volta (2024-09-04追記)
node.jsの管理に NVM for Windows を使っていましたが,最近 Volta に変えました. Voltaはプロジェクトごとに使用するNodeのバージョンを自動で切り替えてくれます.NVMではグローバルで使用するNodeのバージョンを手動で切り替えなければなりません. また、NVMはインストーラをダウンロードして実行しなければいけませんが,VoltaはWinGetでインストールできます.現時点では良いところしかありません.
以上です.