Joa*_*lby 6 python python-import python-3.x python-packaging
我有一个具有以下结构的项目:
project/
driver.py
lib/
__init__.py
core/
util.py
common.py
__init__.py
Run Code Online (Sandbox Code Playgroud)
# project/driver.py
import lib.core.common as abc
pass
Run Code Online (Sandbox Code Playgroud)
# project/lib/core/__init__.py
from .util import Worker
Run Code Online (Sandbox Code Playgroud)
# project/lib/core/util.py
import lib.core.common as abc
class Worker:
pass
Run Code Online (Sandbox Code Playgroud)
# project/lib/core/common.py
def stuff():
pass
Run Code Online (Sandbox Code Playgroud)
现在当我运行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'
Run Code Online (Sandbox Code Playgroud)
仅当满足两个条件时才会发生这种情况:
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导入表格.
有人能解释一下这里发生了什么吗?
您有循环依赖导入。你尝试执行
import lib.core.common as abc
Run Code Online (Sandbox Code Playgroud)
在两个文件中,indriver.py和 inutil.py
解决此问题的最简单方法是将路径导入移动到节点模块、某些文档的末尾,或者
def dostuff():
from foo import bar
...
Run Code Online (Sandbox Code Playgroud)
或者这也行得通,
from lib.core import common as abc
Run Code Online (Sandbox Code Playgroud)
当 Python 导入模块时,它会检查模块注册表以查看该模块是否已导入。如果模块已经注册,Python 将使用缓存中的现有对象。模块注册表是已初始化并按模块名称索引的模块表。可以通过 访问该表sys.modules。
如果未注册,Python 会查找该模块,必要时对其进行初始化,并在新模块的命名空间中执行它。