Skip to content

pythonの仮想環境検討(conda, uv)

   
5364文字(約8分)

今の環境の振り返りと、今回の検討目標

現在anacondaを用いて構築しているが、次のような課題がある

  1. 仮想環境が無限に増える傾向(定期的に掃除しているのだが、多い状態が続く)
  2. base環境のバージョンに依存した制約
  3. 更新や依存解決に時間がかかる

今の環境数は次の状態。合計で23GBあるらしい。

1> conda env list
2# conda environments:
3#
4base
5allennlp
6bert
7pycharm_3_09
8python3_11
9sphinx

増えるだけなら良いが、anaconda-navigatorをアップデートしようとするとbase環境のpythonバージョンに依存してしまうらしい。今回python3.7がまだ生き延びていたようで、これによりアップデートできなくなったのだと思う、多分。

 1UnsatisfiableError: The following specifications were found
 2to be incompatible with the existing python installation in your environment:
 3
 4Specifications:
 5
 6  - conda=25.9.1 -> python[version='>=3.10,<3.11.0a0|>=3.11,<3.12.0a0|>=3.9,<3.10.0a0|>=3.12,<3.13.0a0|>=3.13,<3.14.0a0']
 7
 8Your python: python=3.7
 9
10If python is on the left-most side of the chain, that's the version you've asked for.
11When python appears to the right, that indicates that the thing on the left is somehow
12not available for the python version you are constrained to. Note that conda will not
13change your python version to a different minor version unless you explicitly specify
14that.

別にanaconda環境は古くても良い気はするが、なんとなく古いバージョンを残し続けるのも気になるため更新したい。過去もバージョンアップできずいろいろと調べ対応したが、この状態は精神衛生にも悪いし時間も取られる。そのため継続した更新が簡単にできる環境構築を目指す。
ついでにcondaはconda自体の更新や依存パッケージが多い場合の依存解消にやたらと時間がかかる。この辺りも良くなると嬉しい気持ちがあるので他の環境に手を出してみる。

ちなみにbase環境にはあまり理解していなかったころに大量のパッケージを入れてしまったのでpythonバージョンを更新しようとすると依存解消の処理は5時間放置しても終わらなかった。やってられない

構成の検討

まず新たな仮想環境に求める制約だが、anacondaとは共存をさせたい。numpyとかはwindows向けに最適化したもの(mkl)を配布してくれていたり、インストールを楽にしてくれていたことなどなかなかに恩義がありメリットもあるため捨てづらい。そのためanacondaとは共存させたい。もともとパスを通した運用をしていないため、問題にはならないはず。
次に仮想環境の運用方針として、condaと思想が異なるものを採用したい。condaはconda内にpython環境を作成し実行する際にその環境を有効にして使う。これはディスク容量的には使いまわせるためうれしいのだが、どうしても環境が混ざる。しかし自身が作成した最近の仮想環境を見ると混ぜたい系と用途別で別れている。混ぜたい系はcondaを継続しておき、用途別の環境は.venv形式に戻りフォルダ内に仮想環境を作ったとしてもこれまでと使い勝手は変わらないはず、むしろ依存解消の時間が短くなるはず!という方針にしてみる。

ということで今回はuvを追加で使うことにする。これの選定理由は新しくて評判がいい、というぐらい。

ただuvは単独のソフトウェアとして存在するためcondaと同様の問題としてuv自体の更新に手間取る可能性がある。今回はuv自体もパッケージマネージャーの中に入れてしまうということでchocolateyで構築することにする。condaもchocolateyのパッケージにあるが、今回はこれの統合は考えないことにする。

python環境の構成は次のような感じをイメージ(フォルダ構成ではない)。

1/
2|- chocolatey
3 |- uv
4  |- python仮想環境
5|- conda
6 |- python仮想環境(既存分)

以降ではuv環境の構築と、conda環境のbaseスリム化を実施する。

uv環境の構築

uvの構築

chocolateyは入れた記憶がないのだがなぜか入っていた。ひとまず更新する。さぼってcondaと同じ問題が出るのは困る。

1choco upgrade chocolatey

uvを入れる

1> choco install uv
2> uv --version
3
4uv 0.9.3 (83635a6c4 2025-10-15)

入った。簡単、うれしい。

uvによるpython環境構築

ひとまずjupyterでも入れる。バージョン名をフォルダに入れるのはセンスを感じないが仕方ない。忘れてしまう
このコマンドでは、pythonの依存関係を保持するファイルなどを作りセットアップできる、らしい。.gitとかもつくってくれるため思ったより便利に思う。

1> uv init
2
3Initialized project `jupyter-python14`

initを実行すると次のファイルが自動で作成される。

1.git/
2.gitignore
3.python-version
4main.py
5pyproject.toml
6README.md

生成されたファイルがどのようなものかということで試しにpyproject.tomlを見てみる。以降の手順をある程度実施して一通りインストールしたものが次の記載。記法は異なるが書いてある内容はnodeのpackages.jsonに似ている。lockファイルもあるので似たような管理と予想できる。

 1[project]
 2name = "jupyter-python14"
 3version = "0.1.0"
 4description = "Add your description here"
 5readme = "README.md"
 6requires-python = ">=3.14"
 7dependencies = [
 8    "ipykernel>=7.0.1",
 9    "ipywidgets>=8.1.7",
10    "jupyter>=1.1.1",
11    "numpy>=2.3.4",
12    "pandas>=2.3.3",
13    "plotly>=6.3.1",
14]

initだけではpython自体は何も用意されていないため、まずvenvを作る。initで指定も可能なオプションコマンドもあるっぽいが順を追いたいので一つずつ実施した。
作成後にその環境を有効にすることで確認する。括弧が付くと環境が構築できたことがわかり安心。この表記好き。chocoをインストールしようとしたときのターミナルなのでps。コマンドプロンプトでも同じことができる

1> uv venv -p 3.14
2Using CPython 3.14.0
3Creating virtual environment at: .venv
4Activate with: .venv\Scripts\activate
5
6> .\.venv\Scripts\Activate.ps1
7(jupyter-python14) PS E:\program\python\jupyter-python14>

以上の作業でuvによるpython環境と、依存パッケージを管理する前提が整った。以降は必要なものを入れていけばよい。
パッケージの入れ方だが、uvではパッケージの追加にuv adduv pipが使えるらしい。前者はプロジェクトに正式に追加をするコマンドで、後者は追加せずに入れるコマンド。pip後にaddも可能らしいが基本はaddで良いと判断。適当に環境を作る、いつものセットを追加しておく。お気に入りのパッケージをいれておく。

1> uv add jupyter
2> uv add ipykernel
3> uv add plotly
4> uv add numpy
5> uv add pandas

速い、気がする。速い、ことにする(uvを理解するのに3時間ぐらいかかったので価値があったと思いたい)
恐らくパッケージを増やした時と再構築するときに真価を発揮すると思う。ディスク容量をやや圧迫するが、uvはプロジェクト内に依存を保存するため再構築が容易。そのためしばらく使わない環境はさっさと捨ててしまえばよい、と思う。そのため今回は一通りやりたいことを終えしだい、試しに.venvフォルダを捨ててみて再構築が容易かは今後検証する。
復旧時は

1uv sync

でいいらしい。

conda環境のbaseスリム化

base環境にどれだけ入れていたのか調べてみたところ、425packageほど入っていた。anacondaをインストールしていることからデフォルトで多くのパッケージが入っているため、これが多いのか少ないのかはわからない。ひとまず更新に時間がかかりすぎて、やってられないので減らすことにする。もとよりbase環境はもう使っていないのでcondaの管理専用にする。baseを消してしまうとcondaが動かないはずなので消しはしない。

どれを捨てればよいかはAI君に聞くことにする。conda listで出てくるのでいらないやつを教えてもらった。
この時注意が必要なのは、condaとpipが混在している場合はコマンドが異なるという点。解説サイトを見ると混ぜるな危険としてよく非推奨されているが、当然やっている。例えば次のような感じ。

1jxrlib                    1.1                  he774522_2
2keras                     2.6.0                    pypi_0    pypi
3keras-preprocessing       1.1.2                    pypi_0    pypi
4keyring                   23.4.0           py37haa95532_0

kerasなどはpypiから落としているのでconda uninstallでは消せない。condaをインストールしてあるフォルダまで行きpipを使って消す。かつてはqtとか名前空間が違うので重複してインストールしようとするとパスが変わって環境が壊れると言われていたが今はどうなのだろうか。

そんなことを思いつつ、動かなくなったら再インストールする所存で片っ端から削除して70packageまで減らした。その後baseのpythonバージョンを3.13まで引き上げる。10分もかからなかった、ふぇぇ。しかし依存が解消できずに怒られるため、いったんアンインストールすることになった。古い環境の情報を捨てるのがやや惜しまれるが、次の画像を供養とする、10年近くありがとう(そんな前だったのかと少し驚く)。
alt text

なおアンインストールしたらenvフォルダも消えた。聞いてない。使ってる環境も消えた。
ともあれbaseは今後追加しないようにしよう。この悲しみを乗り越えて、今後10年の環境が保たれるはず。

comments powered by Disqus