プログラミングを初めたばかりの皆さんや自分で何かツールやライブラリを作ってみたけど他のディレクトリからImportできない、なんで?と思っている方に向けて解決方法を記載しました。また、ライブラリをpipなどでインストールしたけど使えない方も解決できると思います。
本記事のテーマ
私の使用したPCはUbuntu18.04です。
解決策だけを知りたい方は「ModuleNotFoundErrorの解決策」のみをご覧ください!
ModuleNotFoundErrorの原因調査
これは単純にPath(≒環境変数)が通っていないだけです。
Pathって何?って思われる方もいらっしゃると思います。
私もプログラミングを初めた当初、色んなツールやIDE(統合開発環境)の環境設定をするさいに「まずはPathを通しましょう!、環境変数を設定しましょう」と書かれているだけで具体的に何をシたら良いの?と思うことが多々ありました。
そこで今回は、最近私が衝突した不具合「htm.coreのimportが以前まで出来ていたのにできなくなった」を例に環境変数の設定を例に説明していきたいと思います。
【現象】
・from htm.algorithms.anomaly import AnomalyでModuleNotFoundErrorが発生
・なぜかanomalyだけImport出来ない
【不具合の原因?】
gitで取得したリポジトリの中を自分で色々いじっていたらおかしくなったみたい
【調査内容】
1. pythonがimportしているpathを確認する
import sys
import pprint
pprint.pprint(sys.path)
【実行結果】
'/home/hiro877/anaconda3/lib/python37.zip',
'/home/hiro877/anaconda3/lib/python3.7',
'/home/hiro877/anaconda3/lib/python3.7/lib-dynload',
'/home/hiro877/.local/lib/python3.7/site-packages',
'/home/hiro877/.local/lib/python3.7/site-packages/htm.core-2.0.22-py3.7-linux-x86_64.egg',
'/home/hiro877/anaconda3/lib/python3.7/site-packages'
私の環境では/home/hiro877/.local/lib/python3.7/site-packages/htm.core-2.0.22-py3.7-linux-x86_64.egg
にhtm.coreのpathが通っている模様
2.実際にディレクトリの中身を見てみる
下記コマンドを実行llでもls -alでも何でも良いです。
ll ~/.local/lib/python3.7/site-packages/htm.core-2.0.22-py3.7-linux-x86_64.egg/htm/algorithms
【実行結果】
drwxr-xr-x 3 hiro877 hiro877 4096 1月 11 07:53 ./
drwxr-xr-x 9 hiro877 hiro877 4096 1月 11 07:53 ../
-rw-r--r-- 1 hiro877 hiro877 149 1月 11 07:53 __init__.py
drwxr-xr-x 2 hiro877 hiro877 4096 1月 11 07:53 __pycache__/
-rw-r--r-- 1 hiro877 hiro877 23790 1月 11 07:53 anomaly_likelihood.py
anomaly.pyが何故か入っていない!
ちなみに、実際のファイルが置いてあるディレクトリ上には存在していた
これで、Importするファイルは存在しているのにPathがきちんと通っていな良いことが確認できた。ですので解決策としてはPathを通すだけ1
ModuleNotFoundErrorの解決策
【解決策】
解決策はいくつかあります。
1.使用するpythonスクリプトの中でsys.path.append("相対パス or 絶対パス"で追加)
2.echo PYTHONPATH="/home/user/add:$PYTHONPATH"(ただし、再起動すると設定が消える)
3.~/.bashrcに「export PYTHONPATH="/home/user/add:$PYTHONPATH"」を追記
今回は再起動しても消えない、一番おすすめな方法のみを紹介します。
~/.bashrcとは
簡単に説明しますと、Ubuntuを起動したときに実行されるファイルです。
正確な情報は、
・Ubuntuを起動するとログインシェルというのが起動する
・通常ログインシェルではbashが動く(zshとか言うのにも変更できる)
・bashが起動すると~/.bash_profileというものが動く
・~/.bash_profileの中に~/.bashrcを動かす設定がされていたら~/.bashrcが動く
(標準でbashrcが動くように設定されているはず)
~/.bashrcへの追記内容
~/.bashrcに下記内容を追記してください。場所はどこでも良いですが、一番下に追加しておくと良いでしょう。
export PYTHONPATH="/home/hiro877/Lab/htm.core"
追記した内容を反映させるために下記を実行します。
source ~/.bashrc
再起動しても良いですが、
不具合対応の確認
pythonでfrom htm.algorithms.anomaly import Anomalyを実行してみました。
無事、エラーが発生なく実行できました。
念の為、調査の時に確認したpathの中を見てみます。
anomaly.pyが追加されていました。確認したのは対応した次の日のログイン後なので実際どのタイミングで追加されたのかはわかりませんがpathを通せば追加されるようです。
(base) hiro877@hiro877:~$ ll ~/.local/lib/python3.7/site-packages/htm.core-2.0.22-py3.7-linux-x86_64.egg/htm/algorithms/
合計 44
drwxr-xr-x 3 hiro877 hiro877 4096 1月 11 07:53 ./
drwxr-xr-x 9 hiro877 hiro877 4096 1月 11 07:53 ../
-rw-r--r-- 1 hiro877 hiro877 149 1月 11 07:53 __init__.py
drwxr-xr-x 2 hiro877 hiro877 4096 1月 11 07:53 __pycache__/
-rw-r--r-- 1 hiro877 hiro877 2387 1月 11 07:53 anomaly.py
-rw-r--r-- 1 hiro877 hiro877 23790 1月 11 07:53 anomaly_likelihood.py
以上です。
割と細かく説明したつもりですが、うまく行かなかったり、分からないことがあれば、この記事の下の方にあるコメントやツイッターなどでご質問ください!
今回はUbuntuでの説明を行いました。
WindowsではPathの設定方式が異なるので参考となる記事を参考文献に貼っておきます。
参考文献
・Windows対応
・~/.bashrcとは
https://wa3.i-3-i.info/word13649.html