Anacondaのbase環境のPythonのバージョンアップに失敗した話

# はじめに
筆者は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環境)

# 恐ろしきコード
必ず心にとめておいてほしいのは、**安易にバージョンアップを試みないこと**。既存の環境のバージョンアップをするよりは、仮想環境や別の新しい環境でそのバージョンを使用した方がよい。というよりそうするべきである。
以下、筆者が実行した、恐ろしきコードである。
```powershell
mamba update python=3.13
```
Anaconda Powershell Promptで実行した。なお、筆者は`conda`の代わりに、C++で高速化された`mamba`コマンドを用いているため、
```powershell
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のバージョンを確認してみた。
```powershell
python --version
```
出力結果
```
Python 3.11.7
```
バージョンアップできてないではないか。。
そう、失敗したのである。ただ、これは本当の意味での失敗ではない。
恐ろしいのは、バージョンが変わっていないことではない。

base環境でのpythonのバージョンが変わっていない。では、仮想環境ではどうだろう。
そこで、仮想環境`sample`をアクティベートしてみることにした。
```powershell
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コマンド自体が使えなくなっている**のであった。
でも、そんなことをつゆ知らず、仮想環境が有効化できないだけだろうと楽観的に考え、以下のコマンドを実行した。導入済みのパッケージの一覧を表示するものである。
```powershell
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をダウンロードする。

https://www.anaconda.com/download/success

Anacondaの導入方法と何ら変わらず、無事導入できた。

## 2. Minicondaの起動
続いて、Anaconda Powershell Prompt (Miniconda 3)を管理者権限で実行する。

## 3. 回復用の環境を準備
回復するための仮想環境をMiniconda内に作成する。
Anaconda Powershell Prompt (Miniconda 3)で、
```powershell
conda create -n recovery python=3.11.7
```
を実行する。なお、pythonのバージョンは、破壊された環境のもともとのものを指定する。
作成後、
```powershell
conda activate recovery
```
を実行し、仮想環境を有効化する。（例えば）以下のような表示であれば成功である。
```
(recovery) C:\Windows\System32>
```
この仮想環境から、Anacondaのbase環境を直接修復するわけである。

## 4. 壊れたAnaconda環境に直接Pythonを再インストール
`conda`コマンドでは、指定したディレクトリにパッケージなどを導入することができる。
以下のコマンドで、壊れたAnaconda環境（今回では、`C:\ProgramData\anaconda3`のパスにある）に直接`python=3.11.7`を導入する（再インストールする）。
```powershell
conda install -p "C:\ProgramData\anaconda3" python=3.11.7
```
あとは、しばらく待つ。

処理が無事終了した模様である。

それでは、元々あったAnaconda Powershell Prompt （Minicondaではないもの）を用いて、以下のコマンドを実行してみる。
```powershell
conda list
```
すると、、、

base環境に入っていたパッケージの一覧が表示された！
つまり、修復に成功したわけである。
仮想環境のアクティベートも問題なく行える。
そして、Anacondaで何の不具合もなく、パッケージも利用できるし、スクリプトも実行できた。

# 最後に
今回、筆者がAnacondaそのものを破壊してしまってから修復に至るまでの過程を記した。
読者の皆様にも、Anacondaの環境におけるpythonのバージョンアップを試みようとすることがあるかもしれない。
しかし、これだけは心にとめておいてほしい。
**必ず仮想環境を作りなされ**。
これは自分への戒めでもある。そもそも、base環境のpythonのバージョンが古かったとしても、新しいpythonのバージョンで仮想環境を作成し、そこで作業すればよいだけの話である。

何度も言うが、***仮想環境で作業してください***。

以上、Anacondaのbase環境のバージョンアップに失敗した話でした。