首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义包和__init__.py中的Python循环导入

自定义包和__init__.py中的Python循环导入
EN

Stack Overflow用户
提问于 2021-03-18 15:40:43
回答 1查看 2.4K关注 0票数 1

我得到了ImportError:当我尝试运行测试时,无法从部分初始化模块'libs.elastic_search_hunt‘导入名称’libs.elastic_search_hunt‘(很可能是因为循环导入)错误。但我在代码中没有看到任何循环导入。

我有一个名为elastic_search_hunt的包,它包含三个模块:

  1. elastic_query.py
  2. elastic_query_result.py
  3. search_processor.py

我还有__init__.py文件,文件的文本如下:

代码语言:javascript
复制
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

elastic_query.py只有外部导入。

elastic_query_result.py也一样。

search_processor.py有这样的导入:

代码语言:javascript
复制
from . import Query
from . import Result

然后我有一个测试文件,它导入查询类:

代码语言:javascript
复制
from libs.elastic_search_hunt import Query

当我运行测试时,我会得到以下错误:

代码语言:javascript
复制
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)

但是在我的代码中循环导入在哪里呢?我只能假设,当我从测试中导入search_processor查询时,它也会从__init__.py模块导入__init__.py模块,然后再加载查询一次。但是这个错误是关于elastic_query_result模块中的结果的,我只看到了一个结果的导入。

当我将search_processor从__init__.py中删除时,一切正常。

我读过很多关于循环进口的问题,但它们都很明显,没有触及__init__.py.。我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-18 16:03:11

TL;DR:用from .elastic_query import Query代替from . import Query

解释:

当您从libs.elastic_search_hunt模块导入一些东西时,它首先加载__init__.py。因为每个模块在第一次执行导入时,__init__.py也会被执行。

然后Python从__init__.py执行代码,并在第二行执行

代码语言:javascript
复制
from libs.elastic_search_hunt.search_processor import SearchProcessor

它进口search_processor.py。由于它是第一个导入文件,因此必须执行该文件中的所有导入,因此现在也必须执行该文件中的所有导入:

正如您提到的,您的文件中有以下导入:

代码语言:javascript
复制
from . import Query
from . import Result

此时,您告诉python加载整个libs.elastic_search_hunt模块并从中获取Query, Result。所以Python就这么做了。

它试图加载libs/elastic_search_hunt/__init__.py,但等待.它还没有完全装上。因此,它必须加载它,但为了正确地加载它,它必须首先加载search_processor,它需要加载elastic_search_hunt/__init__.py .哦,有个循环。

因此,为了避免这种行为,您应该明确说明您希望从哪个模块加载QueryResult,因此进行更改。

代码语言:javascript
复制
from . import Query
from . import Result

代码语言:javascript
复制
from .elastic_query import Query
from .elastic_query_result import Result

示例:失败的

示例:成功

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66694349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档