Last Updated on 2025年7月28日
概要
Pythonでプログラムを実行していると、「ImportError: cannot import name 'xxx' from 'yyy'」というエラーに遭遇することがあります。このエラーは、特定のモジュールから関数やクラスなどをインポートしようとした際に、それが見つからなかった場合に発生します。
この記事では、このImportErrorの具体的な原因と、その解決方法について、初心者の方にもわかりやすく解説していきます。
目次
エラー内容
|
1 |
ImportError: cannot import name 'xxx' from 'yyy' |
このエラーは、次のようなコードを書いたときに発生します。
|
1 |
from yyy import xxx |
このとき、Pythonはモジュール yyy の中から xxx という名前のオブジェクトを探そうとしますが、見つからなかった場合にImportErrorを投げます。
原因
このエラーの原因には、いくつかのパターンがあります。
1. インポート対象が存在しない
指定したモジュール yyy に、指定したオブジェクト xxx が実際には存在しないケースです。
|
1 2 |
# 例: from math import square # mathモジュールには square は存在しない |
2. 相互インポート(循環インポート)
ファイルAがファイルBをインポートし、同時にファイルBもファイルAをインポートしていると、Pythonが解決できずエラーになる場合があります。
|
1 2 3 4 5 6 7 8 9 10 11 |
# a.py from b import func_b def func_a(): pass # b.py from a import func_a def func_b(): pass |
3. モジュール名のスペルミスやディレクトリ構成の不備
モジュール名やファイル名に誤りがある、あるいは __init__.py ファイルが存在せずパッケージとして認識されないケースもあります。
4. Pythonバージョンの差異
Pythonのバージョンによって、特定の関数やクラスがモジュールから削除・移動されていることもあります。
対処法
1. インポート対象の存在確認
まず、インポートしようとしているオブジェクトが本当に存在するかを確認しましょう。
|
1 2 3 |
# 以下のように確認 import yyy print(dir(yyy)) |
2. モジュールの中身を確認する
インポート先のモジュールのソースコードを直接確認したり、ドキュメントを見て該当のオブジェクトがあるかを調べます。
3. 相互インポートを避ける設計にする
関数定義やインポート構造を見直し、相互に依存しないようにコードを再構成しましょう。共通関数は別モジュールに分離するのも有効です。
4. 相対インポートの見直し
プロジェクト内のモジュール間でインポートを行う場合、相対インポート(.utils など)と絶対インポートの混在はバグの温床になりやすいため、統一を心がけましょう。
5. __init__.py の確認
フォルダがモジュールとして認識されるには、その中に __init__.py ファイルが必要です。これがないとパッケージとして認識されません。
6. Pythonバージョンを確認する
使用しているライブラリが現在のPythonバージョンに対応しているか、オブジェクトの場所が移動していないかを確認しましょう。
|
1 2 3 |
# 例: # Python 3.8 以降では zoneinfo が追加されているが、以前のバージョンには存在しない from zoneinfo import ZoneInfo |
補足
モジュール間の依存関係は複雑になりがちで、インポートエラーは特に初心者にとって厄介な問題です。開発規模が大きくなるほど、構造的な設計が重要になってきます。
また、仮想環境(venvなど)を活用して、Pythonやライブラリのバージョンを明示的に管理するのもおすすめです。
|
1 2 3 |
python -m venv env source env/bin/activate pip install ライブラリ名 |
まとめ
- ImportError: cannot import name 'xxx' from 'yyy' は、インポート対象が見つからない場合に発生
- 対象の存在、スペル、バージョン、モジュール構成などを確認する
- 循環インポートが原因の可能性もある
- 設計や構成を見直すことで再発防止につながる
上記の方法をひとつずつ試していくことで、エラーの原因を絞り込むことができます。焦らずに確認していきましょう。


