最近、ディープラーニングやちょっとしたツールを作る際によくPythonを使うようになりまして、プログラミング自体は問題なく出来るのですが、環境構築とかはそこまで詳しくないため、Anaconda3を利用した環境でちょっとしたトラブルに遭遇しました。
No module named ‘モジュール名’というエラーが発生したのですが、日本語に書き換えるとモジュールが見つかりませんみたいな感じのエラー内容。
しかし、確かにAnacondaでアクティベートした状態からインストールを行っており、パッケージが保存されているディレクトリを見ると、ファイルは存在しているようです。
結論から言うと、pip経由でインストールしたパッケージがあったり、conda経由でインストールしたパッケージがあったりが原因だったようで、conda createで作成した仮想環境を作り直して、すべてconda経由でパッケージをインストールし直すと動作しました。
なぜ、そのような事をしたかというと、ディープラーニングを試してみたくて、とあるブログの手順をそのままコピペで実行したんです。
ところがどっこい、それが原因で使えるパッケージがあったり、使えないパッケージがあったりと仮想環境がぶっ壊れてしまっていたようです。技術ブログあるあるですよね。
ちなみにpip install pytorchを実行して、conda install torchvisionを実行するみたいなゴチャ混ぜな感じです。
なぜ壊れたのだろうか?
色々と調べてみると、Anacondaの仮想環境でpipを使うと、予期しない問題が発生することにより仮想環境そのものがおかしくなる場合があるようです。
では、なぜ壊れてしまうとかというと、condaとpipのパッケージ管理方法が異なるようで、互換性が基本的に一切ないとの事です。そのため、何らかの理由で環境が壊れたりしますし、condaとpipで重複インストールする事も可能です。
ちなみにbase環境で壊してしまうと、Anaconda自体の再インストールが必要になる場合もあり、Anaconda環境を使う場合は、pipを使用するのは辞めて、すべてconda経由でインストールするのが良いと思います。
condaでパッケージが存在しない場合はどうしたらいい?
conda install パッケージ名というコマンドをインストールしようとした時、can’t find packegeというエラーが出る場合があります。割と有名なパッケージでも発生する場合があり、それなら慣れ親しんでいるpipでインストールしちゃえってなるのも分かります。しかし、Anaconda環境でpipを使うべきではないとなるとどうすればいいのか?
conda installコマンドでは、-cまたは–channelオプション(どちらもしてくれる事は同じ)を指定して、チャネルを選ぶ事ができます。チャネルとは、yum等のパッケージ管理ソフトのリポジトリみたいなもので、色んなパッケージが集まっている一塊の事です。
例えば、scipyというパッケージをインストールしたい場合、以下のように指定します。
1 |
conda install scipy -c conda-forge |
condaで提供されていないパッケージを探したい場合は、Anaconda Cloudというサイトで検索する事ができます。
最後に
この問題のおかげで何時間も費やしてしまいましたので、誰かの救いになれると幸いです!