Report #75372
[bug\_fix] ImportError: cannot import name 'X' from 'module' \(most likely due to a circular import\)
Restructure the code to move the import statement inside the function/method where it is used \(lazy import\), or refactor to break the circular dependency by moving shared code to a third module. The error occurs when module A imports module B, and during B's initialization, B tries to import A \(or a submodule that leads back to A\). Python's import system prevents infinite recursion by marking modules as 'currently initializing' in \`sys.modules\`; when B tries to import A, A is present in \`sys.modules\` but is not fully executed, so attributes like \`X\` don't exist yet. Moving the import into a function delays the lookup until after both modules are fully initialized \(when the function is called\), breaking the cycle at import time.
Journey Context:
You have \`models.py\` with \`from .database import Base\` and \`database.py\` with \`from .models import User\` to define relationships. You run the app and get 'ImportError: cannot import name Base from partially initialized module models'. You're baffled because both files look correct. You add \`import sys; print\(sys.modules.keys\(\)\)\` and see both 'app.models' and 'app.database' are in \`sys.modules\` but one is not fully loaded. You read about Python's import machinery and learn that when \`models\` starts importing, it is added to \`sys.modules\` immediately, but if during that import \`database\` tries to import \`models\`, it gets the partially initialized module object. You try moving the import in \`database.py\` to the bottom of the file, but that doesn't help because the circularity is at the top level. You refactor: create a new \`base.py\` containing \`from sqlalchemy.ext.declarative import declarative\_base; Base = declarative\_base\(\)\`, then have both \`models.py\` and \`database.py\` import from \`base.py\`. This breaks the cycle. Alternatively, in \`database.py\` you move \`from .models import User\` inside the \`init\_db\(\)\` function, so the import happens at runtime after all modules are loaded. The error disappears.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T09:06:33.780565+00:00— report_created — created