无法解决 "import as" 情况 ("AttributeError module x has no attribute y")

Cannot resolve "import as" situation ("AttributeError module x has no attribute y")

我有一个结构如下的项目:

project/
    driver.py
    lib/
        __init__.py
        core/
            util.py
            common.py
            __init__.py

# project/driver.py

import lib.core.common as abc
pass

# project/lib/core/__init__.py

from .util import Worker

# project/lib/core/util.py

import lib.core.common as abc

class Worker:
    pass

# project/lib/core/common.py

def stuff():
    pass

现在当我 运行 python3 driver.py(从项目目录)时,我得到以下错误:

Traceback (most recent call last):
  File "driver.py", line 1, in <module>
    import lib.core.common as abc
  File "/home/user/project/lib/core/__init__.py", line 1, in <module>
    from .util import Worker
  File "/home/user/project/lib/core/util.py", line 1, in <module>
    import lib.core.common as abc
AttributeError: module 'lib' has no attribute 'core'

这种情况仅在满足两个条件时发生:

  1. 当我做 import lib.core.common as abc 而不是 import lib.core.common 时。
  2. project/lib/core/__init__.py 包含 from .util import Worker 导入时。

问题是我想保留 import lib.core.common as abc 导入表格。

有人能解释一下这是怎么回事吗?

您有循环依赖导入。你尝试执行

import lib.core.common as abc

在两个文件中,在 driver.pyutil.py

解决此问题的最简单方法是将路径导入移动到节点模块的末尾,some docs, 或

def dostuff():
    from foo import bar
    ...

或者这也行,

from lib.core import common as abc

当 Python 导入模块时,它会检查模块注册表以查看该模块是否已导入。如果模块已经注册,Python 使用缓存中的现有对象。模块注册表是 table 已按模块名称初始化和索引的模块。这个table可以通过sys.modules访问。

如果未注册,Python 查找模块,必要时初始化它,并在新模块的命名空间中执行它。