WindowsでのオススメのPython環境 2026版
2026-01-19(月)
Python環境をuvにする
利点としては以下が挙げられる
- pyenv不要で複数バージョンのPythonがシステムに同居できる
- これまではpyenvによるアクロバチックな切り替えが必要(mac, Linux),各バージョンのインストールは自前でpy.exeでがんばる(Windows)
- 複数バージョンのPythonおよび,パッケージがプロジェクト間で重複してもディスク占有容量が増えない
- 仮想環境の数だけGBオーダーでディスクが圧迫される
uvx --with xxxの機構で仮想環境を作らずにpythonスクリプト(.pyだけでなくipythonのようなインタプリタやjupyterlabも)が実行できる- 特にLLM関係はuvxで書かれた実行サンプルが多い
uv add(pyproject.toml, uv.lock)でのパッケージ管理の方がpipやcondaより圧倒的に速く賢い- 開発環境のシェアが楽
- pipでのインストール順を守らないと入らないような問題が起きにくい
ネガティブな点としては
- なんでもuv経由なのでpython的に気持ち悪い
- 「pythonなんだけどuvコマンド」をどう説明するか悩む
1. インストール
uvについては配布元に記載されているスクリプトによるインストールが,自身のアップデートにも対応できるのでオススメ.
Windowsの場合はコマンドプロンプトまたはPowerShellで下記を実行
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
MacやLinuxの場合
curl -LsSf https://astral.sh/uv/install.sh | sh
で,WindowsやMac, Linuxで一旦そのウィンドウを閉じて再度開くとuvがパスに入った状態になる.
uvは感覚としてはPython Launcherのpy.exeに近いようなもんだが,より実体が隠蔽された形式になりpython本体もuvを経由して起動することになる.
例えば
uv run python
という感じで実行すると勝手に最新版のPythonをダウンロードしてインタプリタが開く.バージョンを指定したい場合は
uv run --python 3.12 python
のようにオプションで指定する.
2. プロジェクトの作成とパッケージ管理
uvでの開発についてはフォルダが単位となるプロジェクトとして扱う.従来のvenvみたいなもんだが,uvが実体を一括管理してくれて各プロジェクトにはHardLinkやRefLinkやBlockClone等でディスク容量を圧迫しない仕組みになっている.
例えばPython 3.12のプロジェクト pj1 を作る場合
mkdir pj1
cd pj1
uv python pin 3.12
uv init
でpyproject.tomlが作られ,3.12に固定される.パッケージの追加はuv addで行う.pipは使わない.
uv add numpy
とか
uv add "numpy>2.0"
とか,pip installをuv addに置き換えたと考えればよい.
依存関係はpyproject.tomlに保存され,実際に入ったパッケージの情報がOSに依存しないような方法でuv.lockに保存される.
3. プロジェクト内での実行
スクリプトの実行
hello.pyを実行したい場合
uv run hello.py
ipython, python, jupyterlabの実行
uv run ipython
uv run python
uv run jupyter lab
みたいな感じでインストールされるスクリプトもuv runできる
4. プロジェクトに特定パッケージをインストールさせずに実行
--with package付きでuv runuvx scriptnameで実行(ipythonとかスクリプトが同時にインストールされるタイプのものでwithを省略できる)
--withは現プロジェクトでとりあえず任意のパッケージを追加して実行してみたい場合に有効で,そのパッケージ以外はプロジェクトが使われる.
uvx を使えば環境を汚さずに実行できる.これはuvx scriptnameが実行されたときに暗黙で--with scriptnameを指定する挙動になるため,重複しないコマンドが書ける.パッケージ名とスクリプト名が一致しない場合は--fromを書く.
ということで,uvxはお作法としてipythonとかuv addしたときに実行形式ファイルも一緒に入るタイプのものの実行に使う.ただしpythonのバージョンは指定しないと
--pythonで指定したバージョン- 環境変数
- 過去にpinしたバージョン
- uvで使っているPythonの中で最新のもの
- システムのPython
の順で決まるらしい.
インタプリタにワンライナーで命令を食わせる場合
uv run --python 3.12 --with numpy --with libsvm-official python -c "from libsvm.svmutil import *; y, x = [1,-1], [{1:1, 3:1}, {1:-1,3:-1}]; prob = svm_problem(y, x); param = svm_parameter('-t 0 -c 4 -b 1'); m = svm_train(prob, param)"
numpy入りのipythonを後腐れ無く使う場合
uvx --with numpy ipython
open3d入りのmarimoを後腐れなく使う場合
uvx --python 3.12 --with open3d marimo new
uvxで実行スクリプトとパッケージ名が異なる場合
uvx --from httpie http https://google.com
Ultralytics yoloで推論する
Macなので device=mps と書いてるが他は削るかcuda使う
uvx --from ultralytics yolo predict model=yolo26n.pt source=0 show=True device=mps
ファイルサーバを立てたい場合
uvx updog
5. プロジェクトの開発環境の複製
プロジェクト用のフォルダを作り,フォルダ内に別のプロジェクトで生成されたpyproject.tomlとuv.lockを置いて使いたいバージョンでpinしてからuv syncするだけ.例えば上のpj1で作った2ファイルを用意して
cd ..
mkdir pj2
cd pj2
uv python pin 3.12
で,何らかの手段でファイルをpj2にコピーしてから
uv sync
で同じ環境を作ってくれる.condaみたいにos依存のゴミも入らないのでプラットフォームに依存しない.
6. venvで作った仮想環境の移行
とりあえず捨てる前の仮想環境でactivateしておいて
pip freeze > requirements.txt
で使ってるパッケージのバージョン入り一覧が保存できるのでdeactivateして仮想環境のフォルダごと消して良い(パッチ当ててるときは当然その差分も取っておく)
pipの継ぎ足しソースのような状態だと大抵の場合バージョン衝突が起きるので,バージョンをとっぱらって入れてしまうのが早い.クリティカルな問題がある場合は特定パッケージだけ後で指定すれば直してくれる.
Windowsの場合コマンドプロンプトから
powershell -Command "Get-Content requirements.txt | % { uv add ($_ -split '=')[0] }"
Mac やLinuxは
cut -d'=' -f1 requirements.txt | xargs uv add
ただ,pipでインストール順のお陰で奇跡的に動く組合せも存在し,コケることも多々あるので,pythonのバージョンに対して明らかに古いパッケージは外した方が良い.(横着せずにひとつずつuv addすると確実)
7. クラウドストレージとの相性
uvはUV_CACHE_DIRに実体を置いてハードリンクで仮想環境の容量増加を防いでくれるが,クラウドストレージとの相性を考えるとイマイチ. プロジェクトを作ると.venvを作ってしまうのが問題となるが回避策はある.
- Dropbox: .venvフォルダに属性付与して無視させるのは可能.ただし無視させる命令より前に処理が始まるし,空のフォルダは残る
- Box: 無視させる機構は無し
一番無難な解決法はクラウドストレージがシンボリックリンクを解釈できないことを利用して,予め.venvというシンボリックリンクをクラウドストレージ外に設定すること.ただし,各PC環境でリンク設定が必要.Windowsの場合でもmklinkかPowerShellなら
New-Item -ItemType Junction -Path ".venv" -Target "$Home\uv_envs\PJA"
のようにディレクトリジャンクションを使うとよい.