ImportError を修正: Python で名前をインポートできません

Salman Mehmood 2023年6月21日
  1. Python での ImportError: cannot import name エラーの原因
  2. Python の ImportError: cannot import name エラーを修正
ImportError を修正: Python で名前をインポートできません

この説明で、ImportError: cannot import name というエラーが発生する理由を学習します。 Python でこの種のエラーを修正する方法も学習します。

Python での ImportError: cannot import name エラーの原因

このエラーを修正するにはいくつかの方法がありますが、このエラーを修正する方法に入る前に、なぜこのエラーが発生するのか、いつ ImportError が一般的に発生するのかを理解しようとしましょう。

Python の ImportError は、コード内の import ステートメントでモジュールを正常にインポートできない場合に発生します。

このような問題は、通常、外部ライブラリのインストールに失敗したか、インポートしようとしているモジュールへのパスが無効なために発生します。

疑問が生じます: ImportError: cannot import name (xyz) はいつ発生しますか? この種の ImportError は通常、インポートしようとしているクラスが循環依存関係にある場合に発生します。

どういう意味ですか? 循環依存とは何ですか? 通常、循環依存は、2つのモジュールが相互に依存するように同時に相互にインポートしようとした場合に発生します。

これをさらに説明するには、例を見て、このエラーがいつどのように発生するかを理解する必要があります。 demo1.pydemo2.py という 2つのモジュールがあるとします。

import ステートメントに入る前に、これらのモジュールの内容を見てから、import ステートメントを見てみましょう。

ご覧のとおり、demo2 モジュールには、demo2_func1()demo2_func2() という 2つの関数があります。 同様に、demo1 モジュールには demo1_func1() という単一の関数があります。

ご覧のとおり、demo2 モジュール内では、モジュール demo1 から demo1_func1 をインポートしています。 同様に、demo1 モジュール内で、demo2 モジュールの一部である demo2_func2() という関数をインポートしようとしています。

Python ImportError Cannot Import Name Example

demo2 モジュールに注目しましょう。

demo2_func1() 関数が何らかの文字列を出力し、demo1 モジュールからインポートした demo1_func1() 関数をロードすることがわかります。 demo1_func1() が呼び出されると、何らかの文字列が出力されます。

次の行では、demo1_func1() 関数内で demo2_func2() メソッドを呼び出すため、demo2_func2() メソッドも demo1 モジュールの一部であることがわかります。 これらのモジュールは両方とも相互依存していることがわかります。

この場合、from demo1 import demo1_func1from demo2 import demo2_func2 のようなステートメントを使用すると、循環依存が発生します。

demo2 モジュールを実行すると、最初に demo2_func1() が呼び出され、次に demo1_func1() 関数に移るので、期待される出力は次のようになります。 実行後、(名前 'demo1_func1' をインポートできません) という ImportError が発生します。

ImportError: cannot import name 'demo1_func1' from partially initialized module 'demo1' (most likely
due to a circular import)

これは主に、あるモジュールの内容に別のモジュールからアクセスしようとしたり、その逆を行ったりするために発生します。 demo2.py モジュールを見ると、demo1_func1 が初期化される前に demo1 から demo1_func1 関数をインポートしようとします。 それがプログラムの開始時です。

Python はまだ demo1 モジュールの内容を初期化していますが、demo1_func1 関数を初期化するための十分な時間を Python に与えていません。 これを直接呼び出しているため、この ImportError が発生しました。

Python の ImportError: cannot import name エラーを修正

次に、このエラーを修正する方法を見ていきます。 このエラーは 2つの方法で修正できますが、循環依存を回避する最も簡単な方法を使用します。Python だけで実行できます。

この問題を解決するには、特定のコードを変更する必要があります。

import ステートメントを変更する必要があり、モジュールの内容をインポートする代わりに、モジュール全体を両方のファイルにインポートします。

demo1.py ファイルのソース コード:

import demo2


def demo1_func1():
    print("demo1_func1")
    demo2.demo2_func2()

demo2.py ファイルのコード:

import demo1


def demo2_func1():
    print("demo2_func1")
    demo1.demo1_func1()


def demo2_func2():
    print("demo2_func2")


if __name__ == "__main__":
    demo2_func1()

出力:

demo2_func1
demo1_func1
demo2_func2

ほとんどの場合、このエラーはブループリント アプローチを使用して Flask アプリを開発しているときに発生するため、Flask 構造を作成している場合は、この リンク に従う必要がある場合があります。

著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

関連記事 - Python Error