【发布时间】: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'
这仅在满足两个条件时发生:
- 当我使用
import lib.core.common as abc而不是import lib.core.common时。 - 当
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 -> lib.core.__init__ -> lib.core.util.Worker -> lib.core.common。在定义Worker时,common模块还不会真正存在。为什么需要像这样将Worker拉到包作用域中?
标签: python python-3.x python-import python-packaging