人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

ModuleNotFoundError PythonでライブラリImportできない問題解決! 解決手順を例を用いて解説

f:id:hiro-htm877:20200111190721p:plain




 

f:id:hiro-htm877:20190601202549p:plain

 

 

 

  

 

 

 

プログラミングを初めたばかりの皆さんや自分で何かツールやライブラリを作ってみたけど他のディレクトリからImportできない、なんで?と思っている方に向けて解決方法を記載しました。また、ライブラリをpipなどでインストールしたけど使えない方も解決できると思います。

 

本記事のテーマ

PythonでライブラリImportできない問題解決!」

・Importできない原因・理由

・対処方法、~/.bashrcとは? 

私の使用した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対応

qiita.com

 

・~/.bashrcとは

https://wa3.i-3-i.info/word13649.html

 

note.nkmk.me