はじめに
筆者はAnacondaを使用している。この度、どういうわけか、base環境のPythonのバージョンを上げようとしたのである。もともとpython=3.11
だったので、python=3.13
に上げたかったため、恐ろしきコードを実行してしまったわけである。
それでは、Anacondaの環境が破壊されてから、復旧するまでの道のりを紹介しよう。
実行環境
- Windows 11 Home (24H2)
- Anaconda 3 (Conda 25.5.1)
- Python 3.11.7 (Anacondaのbase環境)
恐ろしきコード
必ず心にとめておいてほしいのは、安易にバージョンアップを試みないこと。既存の環境のバージョンアップをするよりは、仮想環境や別の新しい環境でそのバージョンを使用した方がよい。というよりそうするべきである。
以下、筆者が実行した、恐ろしきコードである。
mamba update python=3.13
Anaconda Powershell Promptで実行した。なお、筆者はconda
の代わりに、C++で高速化されたmamba
コマンドを用いているため、
conda update python=3.13
と実質的には同じ挙動となる。
mamba
コマンドについては以下を参考に。
何が恐ろしいのか?
コード自体は、pythonをpython=3.13
にアップデートするという、いたってシンプルな処理であり、問題はないように見える。
しかしながら、実行した環境が問題であった。
仮想環境ではなく、Anacondaのbase環境で実行してしまったのである。
先ほどのコードを実行すると、大量のログが流れてくる。それを流し読みしていると、python=3.13
の核となる部分を導入した後、パッケージをpython=3.11
からpython=3.13
にリンキングしなおしている様子が見られた。順調に進んでいるなと思っていた。
すると。
突如、以下のエラーメッセージが表示された。
ImportError: cannot import name '_Globber' from 'glob' (C:\ProgramData\anaconda3\Lib\glob.py)
なんか停止したぞ、、と思ったが、まあ問題ないだろうと考え、さっそくbase環境のPythonのバージョンを確認してみた。
python --version
出力結果
Python 3.11.7
バージョンアップできてないではないか。。
そう、失敗したのである。ただ、これは本当の意味での失敗ではない。
恐ろしいのは、バージョンが変わっていないことではない。
base環境でのpythonのバージョンが変わっていない。では、仮想環境ではどうだろう。
そこで、仮想環境sample
をアクティベートしてみることにした。
conda activate sample
おそらく、読者の皆様は、例えば、
(sample) C:\Windows\System32>
といったように、コンソールの先頭に仮想環境名が入っているような状態になると想定するだろう。
しかし。出力結果は
Traceback (most recent call last):
File "C:\ProgramData\anaconda3\Lib\site-packages\conda\exception_handler.py", line 28, in __call__
return func(*args, **kwargs)
...
(長いので省略)
...
File "C:\ProgramData\anaconda3\Lib\pathlib\_abc.py", line 15, in <module>
from glob import _Globber, _no_recurse_symlinks
ImportError: cannot import name '_Globber' from 'glob' (C:\ProgramData\anaconda3\Lib\glob.py)
Invoke-Expression : 引数が空の文字列であるため、パラメーター 'Command' にバインドできません。
発生場所 C:\ProgramData\anaconda3\shell\condabin\Conda.psm1:76 文字:36
+ Invoke-Expression -Command $activateCommand;
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Invoke-Expression]、ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.Invo
keExpressionCommand
長くなって申し訳ないが、これよりももっと長いエラー文が返ってきたのである。
ImportError: cannot import name '_Globber' from 'glob' (C:\ProgramData\anaconda3\Lib\glob.py)
この部分は先ほどと同じであるが、以下が恐ろしいのである。
Invoke-Expression : 引数が空の文字列であるため、パラメーター 'Command' にバインドできません。
これ、最初はよく分からなかったが、どうやらcondaコマンド自体が使えなくなっているのであった。
でも、そんなことをつゆ知らず、仮想環境が有効化できないだけだろうと楽観的に考え、以下のコマンドを実行した。導入済みのパッケージの一覧を表示するものである。
conda list
出力結果
...
(長いので省略)
...
ImportError: cannot import name '_Globber' from 'glob' (C:\ProgramData\anaconda3\Lib\glob.py)
先ほどと同様のエラーである。とどのつまり、conda
コマンドは完全に使えなくなったということである。
要は、Anacondaの環境が破壊されたということである。
なぜ恐ろしきコマンドだったのか?
端的に言うと、base環境でpythonのバージョンアップを実行しようとすると、パッケージの依存関係が破壊され、互換性がなくなるのである。それゆえ、バージョンアップを実行した結果、Anaconda環境が破壊されたのである。
以下、簡単に詳細を示す。
python=3.11
とpython=3.13
では、内部構造が異なる。具体的には、
pathlib
glob
といったものである。
先ほどのエラー:
ImportError: cannot import name '_Globber' from 'glob' (C:\ProgramData\anaconda3\Lib\glob.py)
では、glob.py
に関するエラーが出ていたが、まさにこのglob.py
の内部構造がpython=3.11
とは異なるものになってしまったために、python内部のシステムが不具合を起こしたのである。
また、すでにpython=3.11
のときに導入していたパッケージは、python=3.13
で利用される想定では当然ないわけである。そこでもバージョンの不整合が生じてしまう。
そんなわけで、見事にAnaconda環境は崩壊した。
仮想環境なら、また作り直せばよかったが、base環境が破壊されてしまったため、Anaconda単体での修復は困難である。
(関連するファイルをいじって直す猛者はいるかもしれないが。。)
修復する方法
修復できるかどうかもわからない状態でしばらく途方に暮れていたが、ある存在を思い出した。
そう、Minicondaである。
これは、Anacondaの軽量版であるが、基本的な機能は備わっている。
これを用いて環境を復旧できるのではないか?と考えた。
1. Minicondaの導入
以下のサイトからMiniconda Installerをダウンロードする。
Anacondaの導入方法と何ら変わらず、無事導入できた。
2. Minicondaの起動
続いて、Anaconda Powershell Prompt (Miniconda 3)を管理者権限で実行する。
3. 回復用の環境を準備
回復するための仮想環境をMiniconda内に作成する。
Anaconda Powershell Prompt (Miniconda 3)で、
conda create -n recovery python=3.11.7
を実行する。なお、pythonのバージョンは、破壊された環境のもともとのものを指定する。
作成後、
conda activate recovery
を実行し、仮想環境を有効化する。(例えば)以下のような表示であれば成功である。
(recovery) C:\Windows\System32>
この仮想環境から、Anacondaのbase環境を直接修復するわけである。
4. 壊れたAnaconda環境に直接Pythonを再インストール
conda
コマンドでは、指定したディレクトリにパッケージなどを導入することができる。
以下のコマンドで、壊れたAnaconda環境(今回では、C:\ProgramData\anaconda3
のパスにある)に直接python=3.11.7
を導入する(再インストールする)。
conda install -p "C:\ProgramData\anaconda3" python=3.11.7
あとは、しばらく待つ。
処理が無事終了した模様である。
それでは、元々あったAnaconda Powershell Prompt (Minicondaではないもの)を用いて、以下のコマンドを実行してみる。
conda list
すると、、、
base環境に入っていたパッケージの一覧が表示された!
つまり、修復に成功したわけである。
仮想環境のアクティベートも問題なく行える。
そして、Anacondaで何の不具合もなく、パッケージも利用できるし、スクリプトも実行できた。
最後に
今回、筆者がAnacondaそのものを破壊してしまってから修復に至るまでの過程を記した。
読者の皆様にも、Anacondaの環境におけるpythonのバージョンアップを試みようとすることがあるかもしれない。
しかし、これだけは心にとめておいてほしい。
必ず仮想環境を作りなされ。
これは自分への戒めでもある。そもそも、base環境のpythonのバージョンが古かったとしても、新しいpythonのバージョンで仮想環境を作成し、そこで作業すればよいだけの話である。
何度も言うが、仮想環境で作業してください。
以上、Anacondaのbase環境のバージョンアップに失敗した話でした。