概要
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
...
これでエラーはなくなりました。
依存関係を見直して、もっとすっきりさせたほうがいいと思うので、
一旦はこのような対応、くらいの認識が良いかと思います。