【问题标题】:Cannot resolve "import as" situation ("AttributeError module x has no attribute y")无法解决“import as”情况(“AttributeError module x has no attribute y”)
【发布时间】:2018-11-16 13:18:11
【问题描述】:

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

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 导入表单。

谁能解释一下这里发生了什么?

【问题讨论】:

  • 不是一个直接的答案,但如果您不执行 lib/core/__init__.py 中的热切 from .util import Worker,您的问题就会消失。基本上,你有一个依赖循环:lib.core.common -&gt; lib.core.__init__ -&gt; lib.core.util.Worker -&gt; lib.core.common。在定义 Worker 时,common 模块还不会真正存在。为什么需要像这样将Worker 拉到包作用域中?

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


【解决方案1】:

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

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 会找到该模块,必要时初始化它,并在新模块的命名空间中执行它。

【讨论】:

  • 将路径导入移到节点模块末尾是什么意思?我可以要求一个适用于我的案例的示例吗?
  • @JoaoAlby 我更新了我的答案,您可以在两个文件中使用from lib.core import common as abc,它会起作用
  • 文件中间的import是针对pep8的
猜你喜欢
  • 2020-11-23
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 2022-12-01
  • 2022-10-21
  • 2022-08-04
  • 2015-09-26
  • 2022-08-24
相关资源
最近更新 更多