无法解决"导入为"情况(" AttributeError模块x没有属性y")

时间:2018-06-06 18:42:36

标签: python python-3.x python-import python-packaging

我有一个具有以下结构的项目:

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导入。
  3. 问题是我想保留import lib.core.common as abc导入表单。

    有人可以解释一下这里发生了什么吗?

1 个答案:

答案 0 :(得分:0)

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

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将使用缓存中的现有对象。模块注册表是已按模块名称初始化和索引的模块表。可以通过sys.modules访问此表。

如果没有注册,Python会找到该模块,必要时对其进行初始化,并在新模块的命名空间中执行它。

相关问题