ModuleNotFoundError: No module named ‘*****’

2022年5月13日

エラー詳細

Pythonのエラー

意味

****という名前のモジュールがありません。

原因

import **** としたときに ****が見つからず読み込めないということ。

Pythonスクリプトは実行時にimportで指定されたモジュールを

  • python標準パッケージ用のディレクトリ(=フォルダ)
  • pythonサードパッケージ用のsite-pacagesディレクトリ
  • PYTHONPATH環境変数で指定されたディレクトリ(=フォルダ)
  • スクリプトを実行したカレントディレクトリ
  • スクリプトファイルが置いてあるディレクトリ

から探し出そうとする。(最初の3つがどこを指すかはPythonをインストールした場所に依存)

全部探してどこにも指定された名前のモジュールがみつからないときにこのエラーがでる。

エラー対処方法

まずはスペルミスを確認する。調べに調べて最終的に単なるスペルミスだったときの虚無感は半端ない。

スペルが合ってるようなら、モジュールの種類によって対処法が変わる。

標準モジュールの場合

バージョンはあっているか

利用しているpythonのバージョンを確認し、本当にそのモジュールが標準として含まれているのか調べ、必要に応じてアップデートする。

例えばpython3系を使ってるつもりで2系を使ってたとか。そうそうないだろうが、CentOSみたいに未だに2系がデフォルトのものもあるので、臨時で別環境使うときなんかは注意。

なお、バージョンも問題ないのに標準モジュールが読めないというのは考えにくい。Python自体がおかしい可能性があるのでPythonを再インストールする。

サードパーティモジュールの場合

インストールはされているか

pandasやnumpyなど、web上では当たり前のようにサンプルコードに出てくるが、これらは標準パッケージではないので自分でインストールしない限りはimportできない。インストールした覚えがなければインストールする。

pip install ****

anaconda環境ならconda install, pipenvを使ってるならpipenv install それぞれ状況に応じた方法で。

実行環境は間違っていないか

インストールしたはずなのにエラー解消されない場合、インストールした実行環境で実行できてるか確認する。

例えば仮想環境へのインストールをしたのに、実行にはグローバルのPythonを使ってた、など。

例えばVSCodeを使ってて、コンソール上では仮想環境でpipenv install したくせに、VSCodeでは素のPythonが選択されたままになってて、importできてない、とか。実際についこないだやらかして小一時間ハマってた。

(プロジェクトとは全く別の)自作モジュールの場合

モジュールは正しい場所に入ってるか

モジュールは上記5つのうちのどこかにある必要がある。いろんなプロジェクトから使われるモジュールであれば専用のディレクトリを作ってパスを通すことが多いだろうか。とにかくまずはモジュールの置き場所を確認する。

そしてエラーが出てるプログラムで

import sys
print (sys.path)

と実行してみて、モジュールが置かれたパスが表示されるか確認する。

表示されないならパスを通す(PYTHONPATHに追加)なり、モジュールの置き場を変えるなりして対応する。

(同じプロジェクト内の)自作モジュールの場合

書き方確認

たとえば同じフォルダに入ってる “my_python_file.py"というファイルを読み込みたいのであれば、こう書く。

import my_python_file

同じ階層にあるフォルダ “my_folder" 内の ”my_child_file.py"を読み込みたいならこう書く

import my_folder.my_child_file

.pyという拡張子はいらないし、フォルダの階層は.(ピリオド)で表すと思えばいい。

読める場所にあるのか確認

上記の書き方では同じ階層か自分より下の階層にあるファイルしか読めない。

もちろん読めるようにする方法はあるが、作成しているものがモジュールではない場合は本当にその構造でいいのか今一度見直すことをおすすめしたい。

(モジュール作ってる場合は相対インポートで書いて、実行時に -m オプションをつければエラーは出ない)