0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】circular importエラーの場合は「関数内import」でエラーを解消できる

Posted at

概要

Pythonのプログラムを動かしていると以下のエラーに。

E ImportError: cannot import name 'XXXX' from partially initialized module 'aaa.bbb.ccc' (most likely due to a circular import)

エラーの理由は、循環インポート(circular import)でした。

原因

  • aaa.bbb.ccc の中で from aaa.bbb.ddd import YYYY をimport
  • 一方、from aaa.bbb.ddd の中で aaa.bbb.ccc import XXXX をimport

上記のようなimportをしている場合、お互いのファイルが同時に相手をimportしようとして、どちらも初期化が終わらず、ImportErrorが発生していたのです。

Pythonはモジュールをimportする際、最初にファイルを実行してグローバルスコープを初期化します。
その途中で相手のモジュールをimportしようとすると、まだ初期化が終わっていないため、
from ... import ... で該当クラスや関数が見つからず ImportError になった、というわけです。

解決策

もし不要ならどちらかを削除するのが早いですが、
どうしても避けられない場合は、
import文を関数やメソッドの中に移動することで、
モジュールの初期化が終わった後にimportされるようにできます。

例:

class XXXX:
    def sample_function(self, ...):
        from from aaa.bbb.ddd import YYYY  # 関数内import
        ...

これでエラーはなくなりました。

依存関係を見直して、もっとすっきりさせたほうがいいと思うので、
一旦はこのような対応、くらいの認識が良いかと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?