背景
「ある環境ではcondaを使えるのに、別の環境だと突然使えなくなった…」
最近、この件について時間を溶かしている人を多く聞くので、こちらの記事をまとめました。
問題となるエラーは、condaをactivateした際に発生する以下のものです。
Traceback (most recent call last):
File "/work/hoge/**/miniconda3/bin/conda", line 12, in <module>
from conda.cli import main
ImportError: No module named conda.cli
/work/hoge/**/miniconda3/bin/python
を立ち上げてcondaをimportしてみると、問題なく実行できます。これは、一体どういうことなのでしょうか?
解決法
先に問題の解決方法を挙げますと、以下のどちらかを選んでください。
- 仮想環境を構築するパスの長さを浅く(bin/python含めて127文字以下に)する
- 最新のOSにアップデートする
(他にも良い方法がありましたらお知らせください)
原因
エラーメッセージに表示されていたファイルの1行目を見てみてください。
$ head -n 1 /work/hoge/**/miniconda3/bin/conda
ここで、もしかすると以下のように表示されていませんか?
#!/usr/bin/env python
本来ならば、ここは
#!/work/hoge/**/miniconda3/bin/python
となっていて欲しいはずです。もしかして、あなたのケースでは、**
の部分がかなり長い文字列になっていないでしょうか? 実は、shebangの長さは決まっていて、それ以上長いとOSが処理することができません。そのため、自動で#!/usr/bin/env python
に書き換わる仕様になっているようです(どちらかというと、エラーを吐いて落ちて欲しいですが…)。
そのshebangの最大長は、以下で確認することができます。
$ grep BINPRM_BUF_SIZE /usr/include/linux/binfmts.h
Ubuntu 22.04ならこの値は256になっていますが、古いOSだと128になっていることが多いです。このため、上記の問題を解決するためには、OSをアップデートするか、そもそものパスを短くすれば良いということになります。もちろん、最新のOSでもshebangの最大長はありますので、この長さを超えないようにする必要があります。パスの最大長はBINPRM_BUF_SIZE
より1だけ小さくなりますが、エクスクラメーションマーク(!)の分によるものかと思われます。
終わりに
いかがでしたでしょうか。個人的には、もう少し周知されても良い内容なのではないかと思います。GitHubの方ではissueが立っているようなので、今後何かしらの進展があるかも知れません。
初めての記事でお見苦しいところがあるかも知れませんが、皆様の活動の一助となれば幸いです。
ここまでお読みくださり、ありがとうございました。
2023年7月3日 満月
参考