我有一个以下结构的项目:
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 -> lib.core.__init__ -> lib.core.util.Worker -> lib.core.common
。当定义Worker
时,common
模块实际上还不存在。为什么需要像那样将Worker
引入软件包范围内呢? - Daniel Pryden