ImportError を修正: Python で名前をインポートできません
この説明で、ImportError: cannot import name
というエラーが発生する理由を学習します。 Python でこの種のエラーを修正する方法も学習します。
Python での ImportError: cannot import name
エラーの原因
このエラーを修正するにはいくつかの方法がありますが、このエラーを修正する方法に入る前に、なぜこのエラーが発生するのか、いつ ImportError
が一般的に発生するのかを理解しようとしましょう。
Python の ImportError
は、コード内の import
ステートメントでモジュールを正常にインポートできない場合に発生します。
このような問題は、通常、外部ライブラリのインストールに失敗したか、インポートしようとしているモジュールへのパスが無効なために発生します。
疑問が生じます: ImportError: cannot import name (xyz)
はいつ発生しますか? この種の ImportError
は通常、インポートしようとしているクラスが循環依存関係にある場合に発生します。
どういう意味ですか? 循環依存とは何ですか? 通常、循環依存は、2つのモジュールが相互に依存するように同時に相互にインポートしようとした場合に発生します。
これをさらに説明するには、例を見て、このエラーがいつどのように発生するかを理解する必要があります。 demo1.py
と demo2.py
という 2つのモジュールがあるとします。
import
ステートメントに入る前に、これらのモジュールの内容を見てから、import
ステートメントを見てみましょう。
ご覧のとおり、demo2
モジュールには、demo2_func1()
と demo2_func2()
という 2つの関数があります。 同様に、demo1
モジュールには demo1_func1()
という単一の関数があります。
ご覧のとおり、demo2
モジュール内では、モジュール demo1
から demo1_func1
をインポートしています。 同様に、demo1
モジュール内で、demo2
モジュールの一部である demo2_func2()
という関数をインポートしようとしています。
demo2
モジュールに注目しましょう。
demo2_func1()
関数が何らかの文字列を出力し、demo1
モジュールからインポートした demo1_func1()
関数をロードすることがわかります。 demo1_func1()
が呼び出されると、何らかの文字列が出力されます。
次の行では、demo1_func1()
関数内で demo2_func2()
メソッドを呼び出すため、demo2_func2()
メソッドも demo1
モジュールの一部であることがわかります。 これらのモジュールは両方とも相互依存していることがわかります。
この場合、from demo1 import demo1_func1
や from 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 構造を作成している場合は、この リンク に従う必要がある場合があります。
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
- AttributeError の解決: 'list' オブジェクト属性 'append' は読み取り専用です
- AttributeError の解決: Python で 'Nonetype' オブジェクトに属性 'Group' がありません
- AttributeError: 'generator' オブジェクトに Python の 'next' 属性がありません
- AttributeError: 'numpy.ndarray' オブジェクトに Python の 'Append' 属性がありません
- AttributeError: Int オブジェクトに属性がありません
- AttributeError: Python で 'Dict' オブジェクトに属性 'Append' がありません