PythonのImportErrorとは?意味・原因・直し方を初心者向けに解説

ながみえ

Pythonでコードを書いていると、ImportError というエラーが表示されることがあります。

特に、importfrom ... import ... を使って、モジュールや関数、クラスを読み込もうとしたときに発生しやすいエラーです。エラーメッセージに cannot import name と表示されることも多く、「何が読み込めていないのか分からない」と感じる方もいるかもしれません。

この記事では、Pythonの ImportError の意味、よくある原因、エラー例、修正方法を初心者向けに解説します。まずは、エラーメッセージの意味を落ち着いて確認しながら、どこを直せばよいのかを順番に見ていきましょう。

Pythonでよく出るエラーを一覧で確認したい方は、「Pythonエラー一覧」も参考にしてください↓↓

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
【完全無料】Python初心者向け完全ガイド
【完全無料】Python初心者向け完全ガイド

ImportErrorとは

ImportError は、Pythonがモジュールやモジュール内の関数・クラスなどを正しく読み込めないときに発生するエラーです。

Pythonでは、別のファイルやライブラリに用意されている機能を使うために、import 文を使います。たとえば、標準ライブラリの機能を読み込んだり、自分で作った別ファイルの関数を読み込んだりするときに使います。

その読み込みがうまくいかない場合に、ImportError が表示されます。特によく見かけるのは、次のようなエラーメッセージです。

ImportError: cannot import name 'xxx' from 'yyy'

これは、「yyy から xxx という名前を読み込もうとしたけれど、見つからなかった」という意味です。

たとえば、モジュール名は合っていても、その中に存在しない関数名やクラス名を指定していると、ImportError が発生することがあります。

初心者のうちは、「ライブラリがないのかな?」と考えてしまうかもしれません。しかし、ImportError では、モジュールそのものではなく、モジュールの中から読み込もうとしている名前に問題があるケースも多いです。

そのため、ImportError が出たときは、まず次の2つを分けて考えると分かりやすくなります。

import モジュール名

この形では、モジュール全体を読み込みます。

from モジュール名 import 名前

この形では、モジュールの中にある特定の関数名、クラス名、変数名などを読み込みます。

ImportError: cannot import name が出ている場合は、後者の from モジュール名 import 名前 の「名前」の部分が間違っていないか、または本当にそのモジュール内に存在するかを確認することが大切です。

ImportErrorが起きる主な原因

ImportError は、import文そのものを書いたときだけでなく、読み込もうとしている名前やファイルの関係に問題があるときにも発生します。

原因は1つだけではないため、まずはよくあるパターンを整理しておくと、エラーメッセージを見たときに原因を見つけやすくなります。

原因内容確認すること
importする名前の間違い関数名やクラス名のつづりが間違っている名前のスペルが正しいか
モジュール内にその名前が存在しないfrom ... import ... で指定した名前が、実際にはモジュール内にないその関数やクラスが定義されているか
ファイル名の衝突自分で作ったファイル名が、標準ライブラリや外部ライブラリ名と同じになっているrandom.pymath.py のような名前にしていないか
循環インポート複数のファイルが互いにimportし合っているファイル同士のimport関係が複雑になっていないか
ライブラリのバージョン違い古い記事やサンプルコードの書き方が、現在のライブラリでは使えないライブラリのバージョンや公式ドキュメントを確認する
相対インポートのミスパッケージの外から相対インポートを実行している実行場所とimport文の書き方が合っているか

ImportError が出ると、すぐに「ライブラリがインストールされていないのでは?」と考えたくなるかもしれません。

しかし、ライブラリやモジュール自体が見つからない場合は、ModuleNotFoundError が表示されることが多いです。一方で、ImportError は、モジュールは見つかっているものの、その中から指定した名前をうまく読み込めない場合によく発生します。

そのため、ImportError を直すときは、まず「モジュール名が間違っているのか」だけでなく、「モジュールの中から読み込もうとしている名前が正しいのか」も確認することが大切です。

特に、次のようなエラーメッセージが表示されている場合は、関数名やクラス名の間違い、またはモジュール内にその名前が存在しないことを疑ってみましょう。

ImportError: cannot import name 'xxx' from 'yyy'

この場合は、yyy というモジュールから xxx を読み込もうとして失敗しています。yyy の中に本当に xxx があるか、名前のつづりが正しいかを確認するのが最初のポイントです。

ImportErrorのエラー例と修正例

ここからは、実際に ImportError が発生するコード例と、その直し方を見ていきます。

ImportError は、エラーメッセージだけを見ると難しく感じるかもしれません。しかし、原因ごとに分けて考えると、確認すべき場所はかなり絞り込めます。

関数名やクラス名を間違えている場合

まず多いのが、from ... import ... で指定した関数名やクラス名を間違えているケースです。

たとえば、次のコードでは math モジュールから squareroot という名前を読み込もうとしています。

from math import squareroot

print(squareroot(16))

しかし、math モジュールに squareroot という関数はありません。そのため、次のようなエラーが発生します。

ImportError: cannot import name 'squareroot' from 'math'

平方根を求める関数は sqrt なので、次のように修正します。

from math import sqrt

print(sqrt(16))

このように、モジュール名が正しくても、その中から読み込もうとしている名前が間違っていると ImportError が発生します。

cannot import name と表示されたときは、まず関数名やクラス名のつづりを確認しましょう。

モジュール内に存在しない名前をimportしている場合

次に、自分で作ったファイルから関数を読み込むときに、存在しない名前を指定しているケースを見てみましょう。

たとえば、同じフォルダに utils.py というファイルがあり、次のような関数が定義されているとします。

def greet():
    print("こんにちは")

この utils.py から hello という関数を読み込もうとすると、エラーになります。

from utils import hello

hello()

utils.py の中にある関数名は greet であり、hello ではありません。そのため、Pythonは hello を見つけられず、ImportError を表示します。

この場合は、実際に定義されている名前に合わせて修正します。

from utils import greet

greet()

自作ファイルを使っている場合は、import文だけでなく、読み込み先のファイルにその関数やクラスが本当に書かれているかも確認しましょう。

ファイル名がライブラリ名と重なっている場合

コードの書き方が正しくても、自分で作ったファイル名が原因で ImportError が発生することがあります。

たとえば、次のコード自体は問題ありません。

from random import randint

print(randint(1, 6))

本来であれば、Pythonの標準ライブラリである random から randint を読み込んで、1から6までのランダムな整数を表示できます。

しかし、同じフォルダの中に random.py という自作ファイルがあると、Pythonは標準ライブラリではなく、自分で作った random.py を先に読み込んでしまうことがあります。

その結果、標準ライブラリの random にあるはずの randint が見つからず、エラーになる場合があります。

このようなときは、自分で作ったファイル名を変更しましょう。たとえば、次のような名前にすると衝突を避けやすくなります。

dice.py
random_test.py
sample_random.py

ファイル名を変更したあともエラーが残る場合は、同じフォルダ内に作成された __pycache__ フォルダや古いキャッシュが影響していることもあります。学習中であれば、一度ファイル名を変えてから実行し直すだけでも解決することが多いです。

循環インポートが起きている場合

複数のPythonファイルを使っていると、ファイル同士が互いにimportし合ってしまうことがあります。

この状態を循環インポートといいます。たとえば、a.pyb.py が次のような関係になっている場合です。

from b import hello_b

def hello_a():
    print("Aです")
from a import hello_a

def hello_b():
    print("Bです")

この例では、a.pyb.py を読み込み、b.pya.py を読み込んでいます。

Pythonは上から順番にファイルを読み込むため、片方のファイルを読み込んでいる途中で、まだ準備できていない名前を読み込もうとしてしまうことがあります。その結果、ImportError が発生する場合があります。

循環インポートを避けるには、共通して使う処理を別のファイルに分ける方法があります。

たとえば、共通の関数を common.py に移動します。

def message():
    print("共通の処理です")

そして、a.pyb.py からそれぞれ common.py を読み込むようにします。

from common import message

def hello_a():
    message()
    print("Aです")
from common import message

def hello_b():
    message()
    print("Bです")

このように、互いにimportし合う関係をなくすと、読み込み順の問題を避けやすくなります。

ライブラリのバージョン違いでImportErrorが起きる場合

外部ライブラリを使っている場合、ライブラリのバージョン違いが原因で ImportError が発生することもあります。

たとえば、古い記事や古いサンプルコードでは使えた関数やクラスが、現在のバージョンでは名前変更されたり、削除されたりしている場合があります。

この場合、コードのつづりが合っていても、使っているライブラリの中にその名前が存在しないため、ImportError が発生します。

ライブラリのバージョンを確認したいときは、ターミナルやコマンドプロンプトで次のように入力します。

pip show ライブラリ名

たとえば、requests のバージョンを確認する場合は、次のように入力します。

pip show requests

古い記事を参考にしている場合は、記事の公開日や更新日も確認しましょう。ライブラリによっては、バージョンが変わるとimport文の書き方も変わることがあります。

そのため、外部ライブラリで ImportError が出たときは、現在使っているバージョンと、参考にしているコードが対応しているバージョンを確認することが大切です。

ImportErrorが出たときの確認ポイント

ImportError が出たときは、エラーメッセージを見ながら、原因になりやすい場所を順番に確認していくのがおすすめです。

いきなりコード全体を直そうとすると混乱しやすいので、まずは「何を読み込もうとして失敗しているのか」を確認しましょう。特に、cannot import name と表示されている場合は、モジュールの中から読み込もうとしている名前に注目します。

確認する順番は、次のように考えると分かりやすいです。

  1. エラーメッセージに cannot import name と表示されているか確認する
  2. importしようとしている関数名やクラス名のつづりを確認する
  3. その関数やクラスが、読み込み元のモジュール内に本当に存在するか確認する
  4. 自分で作ったファイル名が、標準ライブラリや外部ライブラリ名と重なっていないか確認する
  5. 複数のファイルが互いにimportし合っていないか確認する
  6. 外部ライブラリを使っている場合は、ライブラリのバージョンを確認する
  7. モジュール自体が見つからない場合は、ModuleNotFoundError ではないか確認する

たとえば、次のようなエラーメッセージが表示されたとします。

ImportError: cannot import name 'hello' from 'utils'

この場合、Pythonは utils というモジュールから hello という名前を読み込もうとして失敗しています。

そのため、まず確認するべきなのは、utils.py の中に hello という関数や変数、クラスが本当にあるかどうかです。もし greet という名前で定義しているなら、import文もそれに合わせる必要があります。

from utils import greet

また、ImportError はファイル名の衝突でも発生することがあります。たとえば、自分で作ったファイルに random.pymath.py のような名前を付けていると、Pythonが本来の標準ライブラリではなく、自作ファイルを読み込んでしまう場合があります。

コードが正しく見えるのに ImportError が出るときは、import文だけでなく、ファイル名やフォルダ構成も確認してみましょう。

外部ライブラリを使っている場合は、参考にしている記事や教材が古い可能性もあります。ライブラリの仕様が変わると、以前は使えた名前が現在のバージョンでは使えなくなっていることがあります。

このように、ImportError は原因がいくつか考えられるエラーです。ただし、確認する順番を決めておけば、落ち着いて原因を絞り込めます。

ImportErrorに関するよくある質問

ここでは、ImportError について初心者の方が疑問に感じやすいポイントをまとめます。

エラーの意味や ModuleNotFoundError との違いを整理しておくと、実際にエラーが出たときも落ち着いて対応しやすくなります。

ImportError: cannot import name とはどういう意味ですか?

ImportError: cannot import name は、指定したモジュールから、指定した名前を読み込めないという意味です。

たとえば、次のようなエラーが表示されたとします。

ImportError: cannot import name 'hello' from 'utils'

これは、utils というモジュールから hello という名前を読み込もうとしたものの、hello が見つからなかったという意味です。

この場合は、utils.py の中に hello という関数やクラス、変数が本当にあるかを確認しましょう。名前のつづりが間違っているだけでも、ImportError が発生することがあります。

ImportErrorとModuleNotFoundErrorの違いは何ですか?

ImportErrorModuleNotFoundError は、どちらもimportに関係するエラーですが、原因が少し違います。

ModuleNotFoundError は、モジュールやライブラリそのものが見つからないときに発生します。一方、ImportError は、モジュールは見つかっているものの、その中から指定した名前を読み込めないときによく発生します。

違いを簡単に整理すると、次のようになります。

エラー名主な原因確認すること
ImportErrorモジュール内の名前を読み込めない関数名やクラス名が正しいか
ModuleNotFoundErrorモジュール自体が見つからないモジュール名やインストール状況が正しいか

cannot import name と表示されている場合は ImportErrorNo module named と表示されている場合は ModuleNotFoundError を疑うと分かりやすいです。

import文は合っているのにImportErrorが出るのはなぜですか?

import文が正しく見えても、別の原因で ImportError が出ることがあります。

よくあるのは、自分で作ったファイル名が標準ライブラリや外部ライブラリの名前と重なっているケースです。たとえば、random.pymath.py という名前のファイルを作ると、本来読み込みたいライブラリではなく、自分のファイルが読み込まれてしまうことがあります。

また、複数のファイルが互いにimportし合う循環インポートや、ライブラリのバージョン違いが原因になることもあります。

コードだけでなく、ファイル名、フォルダ構成、使っているライブラリのバージョンも確認してみましょう。

循環インポートとは何ですか?

循環インポートとは、複数のPythonファイルが互いにimportし合っている状態のことです。

たとえば、a.pyb.py をimportし、同時に b.pya.py をimportしているような状態です。

このような関係になると、Pythonがファイルを読み込んでいる途中で、まだ準備できていない関数やクラスを読み込もうとして、ImportError が発生することがあります。

循環インポートを避けるには、共通して使う処理を別ファイルに分ける方法があります。たとえば、a.pyb.py の両方で使う関数を common.py に移動すると、ファイル同士が直接importし合う関係を減らせます。

ImportErrorが出たらpip installすれば直りますか?

必ずしも pip install で直るとは限りません。

ライブラリそのものがインストールされていない場合は、pip install が必要になることがあります。ただし、その場合は ImportError ではなく、ModuleNotFoundError が表示されることも多いです。

ImportError が出ている場合は、まずエラーメッセージを確認しましょう。cannot import name と表示されているなら、インストールよりも先に、読み込もうとしている関数名やクラス名が正しいかを確認するのがおすすめです。

まとめ|ImportErrorは読み込めない名前を順番に確認しよう

ImportError は、Pythonがモジュールやモジュール内の関数・クラスなどを正しく読み込めないときに発生するエラーです。

特に、ImportError: cannot import name と表示されている場合は、モジュールの中から指定した名前を読み込めていない可能性があります。まずは、関数名やクラス名のつづりが正しいか、その名前が本当にモジュール内に存在するかを確認しましょう。

また、ファイル名の衝突、循環インポート、ライブラリのバージョン違いが原因になることもあります。コードだけでなく、ファイル名やフォルダ構成もあわせて確認すると、原因を見つけやすくなります。

ライブラリやモジュールそのものが見つからない場合は、ModuleNotFoundError の可能性もあります。エラー名とメッセージをよく見て、どこで読み込みに失敗しているのかを順番に確認していきましょう。

Pythonでよく出るエラーをまとめて確認したい方は、「Pythonエラー一覧」も参考にしてください↓↓

あわせて読みたい
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
Pythonエラー一覧|よくあるエラーの意味・原因・直し方
あわせて読みたい
【完全無料】Python初心者向け完全ガイド
【完全無料】Python初心者向け完全ガイド
記事URLをコピーしました