Rad*_*nal 2 python import circular-dependency package
当我尝试运行测试时,出现ImportError:无法从部分初始化的模块“libs.elastic_search_hunt”导入名称“Result”(很可能是由于循环导入)错误。但我在代码中没有看到任何循环导入。
我有一个名为elastic_search_hunt 的包,其中包含 3 个模块:
我还有__init__.py文件,其中包含以下文本:
from libs.elastic_search_hunt.elastic_query import Query
from libs.elastic_search_hunt.search_processor import SearchProcessor
from libs.elastic_search_hunt.elastic_query_result import Result
__all__ = ['Query', 'SearchProcessor', 'Result'] # I guess it does not have any effect
Run Code Online (Sandbox Code Playgroud)
elastic_query.py仅具有外部导入。
elastic_query_result.py相同。
search_processor.py具有以下导入:
from . import Query
from . import Result
Run Code Online (Sandbox Code Playgroud)
然后我有一个测试文件,它导入Query类:
from libs.elastic_search_hunt import Query
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,我收到以下错误:
test_query.py:2: in <module>
from libs.elastic_search_hunt import Query
..\src\libs\elastic_search_hunt\__init__.py:2: in <module>
from libs.elastic_search_hunt.search_processor import SearchProcessor
..\src\libs\elastic_search_hunt\search_processor.py:4: in <module>
from . import Result
E ImportError: cannot import name 'Result' from partially initialized module 'libs.elastic_search_hunt' (most likely due to a circular import)
Run Code Online (Sandbox Code Playgroud)
但是我的代码中的循环导入在哪里?我只能假设当我从测试导入Query时,它还会从__init__.py模块导入search_processor,而该模块又会再次加载Query 。但错误与elastic_query_result模块中的Result有关,我只看到Result的一个导入。
当我从__init__.py中删除 search_processor 时,一切正常。
我读过很多关于循环导入的问题,但所有这些问题都非常明显,并且没有触及__init__.py。我缺少什么?
小智 10
TL;DR : 替换from . import Query为from .elastic_query import Query
解释:
libs.elastic_search_hunt当您从模块导入某些内容时,它__init__.py首先会加载。由于每个模块在第一次执行时都会执行导入,因此导入__init__.py也会被执行。
__init__.py然后Python从第二行开始执行代码
from libs.elastic_search_hunt.search_processor import SearchProcessor
Run Code Online (Sandbox Code Playgroud)
它进口search_processor.py。由于它是第一次导入 - 文件必须被执行 - 因此该文件中的所有导入也必须立即执行:
正如您所提到的,您的文件中有以下导入内容:
from . import Query
from . import Result
Run Code Online (Sandbox Code Playgroud)
此时,您告诉 python 加载libs.elastic_search_hunt整个模块并Query, Result从中获取。Python 也是如此。
它尝试加载libs/elastic_search_hunt/__init__.py但等待...它仍然没有完全加载。所以它必须加载它,但是为了正确加载它,它必须首先加载search_processor需要elastic_search_hunt/__init__.py加载的......哦,好吧,有一个循环。
因此,为了避免这种行为,您应该明确说明您希望从哪个模块加载Query,Result因此更改
from . import Query
from . import Result
Run Code Online (Sandbox Code Playgroud)
到
from .elastic_query import Query
from .elastic_query_result import Result
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3491 次 |
| 最近记录: |