症状の概略
GNU Screen
などの仮想端末のなかでconda仮想環境を起動したとき、仮想環境のsite-packagesにPATHが通っておらず、あらゆるモジュールがimportエラー(ModuleNotFoundError
)してしまう。
対処法
仮想端末を起動するときはconda deactivate
してある状態でセッションを張ること!
つまり、
(base) $ screen -S example-terminal # <- 新しい仮想端末を起動するコマンド
# example-terminalセッションの中で
(base) $ conda activate hoge
(hoge) $ python text.py
はOKで、
(base) $ conda activate fuga # <- あらかじめconda仮想環境を起動してしまっている!!これがダメ!!
(fuga) $ screen -S example-terminal # <- 新しい仮想端末を起動するコマンド
# example-terminalセッションの中で
(base) $ conda activate hoge
(hoge) $ python text.py
は動かない、ということのようです。
Related Report
ある程度、問題の特定ができたので調べてみると、似たようなissueが見つかりました。
stack overflow | screen inside the conda environment doesnt work
読むと「.bashrcにPATHが通ってないからだぞ」という指摘をしている人がいますが、私の環境ではちゃんと通してあります。
最後の人が
What you can do is start
screen
first, and then activate the conda environmentconda activate my_env
って言っているように、上記の対処がやはり根本的な解消法かなと思います。
症状に気が付いたきっかけ
リモートで作業しているときSSH接続が切れてもプロセスが強制終了しないように、GNU Screenやtmuxを使って作業している人は多いと思います。
(ただし私はscreen派ですのでtmuxのことはほとんど分かりません。)
ところがある日、いつも通りVSCodeのターミナルからpythonスクリプトを実行したらModuleNotFoundError
のエラーが!
でもipythonを立ち上げてimportコマンドをベタ打ちしてもエラーにならないし、VSCodeのデバッガーの中でも特にエラーにはなりません。明らかにターミナルの中のscreenセッションが悪さをしてそう、と思っていくつかのケースを試したら判明した、という経緯です。
結構気づきにくい気がしたので、参考になれば嬉しいです。