Python で ModuleNotFoundError を解決する

Olorunfemi Akinlua 2023年6月21日
  1. 正しいモジュール名を使用して Python で ModuleNotFoundError を解決する
  2. 正しい構文を使用して Python で ModuleNotFoundError を解決する
Python で ModuleNotFoundError を解決する

モジュールは、Python プログラムを開発する上で重要です。 モジュールを使用すると、コードベースのさまざまな部分を分離して、管理を容易にすることができます。

モジュールを操作するときは、モジュールがどのように機能し、コードにインポートする方法を理解することが重要です。 この理解や間違いがなければ、さまざまなエラーが発生する可能性があります。

そのようなエラーの一例は ModuleNotFoundError です。 この記事では、Python 内で ModuleNotFoundError を解決する方法について説明します。

正しいモジュール名を使用して Python で ModuleNotFoundError を解決する

index.pyfile.py の 2つのファイルを使用して単純な Python コードベースを作成し、file.pyindex.py ファイルにインポートします。 両方のファイルは同じディレクトリ内にあります。

file.py ファイルには以下のコードが含まれています。

class Student:
    def __init__(self, firstName, lastName):
        self.firstName = firstName
        self.lastName = lastName

index.py ファイルには以下のコードが含まれています。

import fiIe

studentOne = fiIe.Student("Isaac", "Asimov")
print(studentOne.lastName)

では、index.py を実行してみましょう。 コード実行の出力は以下のとおりです。

Traceback (most recent call last):
  File "c:\Users\akinl\Documents\Python\index.py", line 1, in <module>
    import fiIe
ModuleNotFoundError: No module named 'fiIe'

ModuleNotFoundError があります。 よく見ると、インポート ステートメントに誤植があり、filefIe のように記述されており、l が大文字の I に置き換えられていることがわかります。

したがって、間違った名前を使用すると、ModuleNotFoundError がスローされる可能性があります。 モジュール名を書くときは注意してください。

それでは、修正してコードを実行してみましょう。

import file

studentOne = file.Student("Isaac", "Asimov")
print(studentOne.lastName)

コードの出力:

Asimov

また、from キーワードを使用して import ステートメントを書き直し、importStudent クラスだけにすることもできます。 これは、モジュール内に存在するすべての関数、クラス、およびメソッドをインポートしたくない場合に役立ちます。

from file import Student

studentOne = Student("Isaac", "Asimov")
print(studentOne.lastName)

前回と同じ出力が得られます。

正しい構文を使用して Python で ModuleNotFoundError を解決する

別のモジュールをインポートするときに間違った構文を使用すると、特に別のディレクトリでモジュールを操作するときに、ModuleNotFoundError を取得できます。

前のセクションと同じコードを使用して、さらに複雑なコードベースを作成してみましょう。 このコードベースを作成するには、以下のプロジェクト構造が必要です。

Project/
	data/
		file.py
		welcome.py
	index.py

この構造により、file および welcome モジュールを収容する data パッケージができました。

file.py ファイルには、以下のコードがあります。

class Student:
    def __init__(self, firstName, lastName):
        self.firstName = firstName
        self.lastName = lastName

welcome.py には、以下のコードがあります。

def printWelcome(arg):
    return "Welcome to " + arg

index.py には、filewelcome をインポートしようとするコードが含まれており、クラス Student と関数 printWelcome を使用しています。

import data.welcome.printWelcome
import data.file.Student

welcome = printWelcome("Lagos")
studentOne = Student("Isaac", "Asimov")

print(welcome)
print(studentOne.firstName)

index.py を実行した結果:

Traceback (most recent call last):
  File "c:\Users\akinl\Documents\Python\index.py", line 1, in <module>
    import data.welcome.printWelcome
ModuleNotFoundError: No module named 'data.welcome.printWelcome'; 'data.welcome' is not a package

コードは、サブモジュールの簡単なバインディングfrom キーワードまたは __init__.py を使用する代わりに、ドット演算子を直接使用して、関数 printWelcome とクラス Student をインポートしようとしました。 これを行うと、ModuleNotFoundError がスローされます。

ModuleNotFoundError を防止し、関数とクラスを直接インポートするために、正しい import ステートメント構文を使用しましょう。

from data.file import Student
from data.welcome import printWelcome

welcome = printWelcome("Lagos")
studentOne = Student("Isaac", "Asimov")

print(welcome)
print(studentOne.firstName)

コードの出力:

Welcome to Lagos
Isaac

data パッケージ内のモジュール (filewelcome) をその親名前空間にバインドできます。 これを行うには、__init__.py ファイルが必要です。

__init__.py ファイルでは、パッケージ内のすべてのモジュールとその関数、クラス、またはオブジェクトをインポートして、簡単に管理できるようにします。

from .file import Student
from .welcome import printWelcome

これで、index.py をより簡潔に、親の名前空間 data への適切なバインディングで記述できます。

from data import Student, printWelcome

welcome = printWelcome("Lagos")
studentOne = Student("Isaac", "Asimov")

print(welcome)
print(studentOne.firstName)

出力は、最後のコード実行と同じになります。

ModuleNotFoundError エラー メッセージを回避するには、間違った import ステートメントやタイプミスがないことを確認してください。

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

関連記事 - Python ModuleNotFoundError

関連記事 - Python Error