Python 如何解决无限循环导入?

Python 如何解决无限循环导入?,python,class,import,module,Python,Class,Import,Module,我想了解我问题的根源。我已经遇到过好几次了,每次都要花很长时间才能弄清楚 这一次我觉得我错过了一些我认为我能理解的东西。 相关问题发布在此处: 我决定我的模块呈现一个无限循环,但我仍然得到同样的错误。这就是我所拥有的。 我在这里也包含了\uuuuu init\uuuuuu.py文件,因为我怀疑这个文件可能会导致我目前不知道的行为 在sources/preparation/features/__Init__u;y.py中: from .build_features import * from .g

我想了解我问题的根源。我已经遇到过好几次了,每次都要花很长时间才能弄清楚

这一次我觉得我错过了一些我认为我能理解的东西。 相关问题发布在此处:

我决定我的模块呈现一个无限循环,但我仍然得到同样的错误。这就是我所拥有的。 我在这里也包含了
\uuuuu init\uuuuuu.py
文件,因为我怀疑这个文件可能会导致我目前不知道的行为

sources/preparation/features/__Init__u;y.py
中:

from .build_features import *
from .get_qualified_edges import *
from .select_strategy import *
from .test import *
from Sources.Preprocessing.convertion import Converter # added this lien causes error to be raised
from itertools import combinations
from Sources.Preprocessing.convertion import Converter # added this lien causes error to be raised
sources/preprocessing/_init__.py
中,我有:

from .apply_preprocessing import *
from .convertion import *
sources/preprocessing/apply\u preprocessing
中,我有:

from Sources.Preparation.Features.get_qualified_edges import get_all_GeneDisease_unweighted_disease2disease_qualified_edges
from Sources.Preparation.Features.get_qualified_edges import get_GPSim_disease2disease_qualified_edgesjk
在目录
source/preparation/features/get\u qualified\u edges.py

from .build_features import *
from .get_qualified_edges import *
from .select_strategy import *
from .test import *
from Sources.Preprocessing.convertion import Converter # added this lien causes error to be raised
from itertools import combinations
from Sources.Preprocessing.convertion import Converter # added this lien causes error to be raised
Sources/preprocessing/conversion.py中,我没有导入任何内容

以下是由于出现错误而运行的文件序列:

sources\\uuuu init\uuuuu.py
sources\preparation\\uuuu init\uuuu.py
sources\Preparation\features\\uuuu init\uuuuu.py
sources\preparation\features\build\u features.py
sources\preparation\features\get\u qualified\u edgdes.py
sources\preprocessing\\uuuu init\uuuu.py
sources\preprocessing\apply\u preprocessing.py
\\错误引发
当我从
Sources.Preprocessing.convertion
导入一个类时,会引发错误,如下所示。在
source/preparation/features/get\u qualified\u edges.py
中:

from .build_features import *
from .get_qualified_edges import *
from .select_strategy import *
from .test import *
from Sources.Preprocessing.convertion import Converter # added this lien causes error to be raised
from itertools import combinations
from Sources.Preprocessing.convertion import Converter # added this lien causes error to be raised
如果你们需要更多关于这个问题的信息,请告诉我

我想知道的是:为什么会出现这个问题? 当我将
转换器
源代码.预处理.转换
移动到
源代码.准备.数据.转换
时,我解决了这个问题

观察 我观察到,当
源.Preprocessing.modules_A
(在
源.Preparation.modules_C
中导入)和
源.Preparation.modules_B
中导入时,错误消失了


就这样。模块之间没有直接的“交叉”导入,而是父模块之间有“交叉”导入,如果这有意义的话。

问题在于您引入了来自文件的循环导入

对于
源代码/预处理
中的文件,您正在从
源代码/准备
导入内容。但这些文件反过来又从
源代码/预处理
导入内容

一旦你有了类似这样的导入链

A.py->B.py->C.py->B.py->E.py

(直接循环)

A.py->B.py->C.py->D.py->B.py->E.py

(间接循环)

然后它将无法继续导入模块,因为它不可能终止

在python中解决这个问题的一个简单方法是使用本地导入

例如,代替

来自Sources.Preprocessing.convertion导入转换器
#更多代码。。。。。
A类:
def foo():
bar=转换器()
您可以改为使用本地导入,如

#更多代码。。。。。
A类:
def foo():
从Sources.Preprocessing.convertion导入转换器
bar=转换器()
这样它只在您实际使用对象之前导入。这将避免在开始时导入所有内容,从而避免循环导入


编辑:

简言之,要回答OP关于这一特定问题的问题:

在代码的某个地方,您启动了导入预处理模块。(可能在
sources\preparation\features\get\u qualified\u edgdes.py
?不太确定) 此时,预处理被添加到
sys.modules
命名空间中,但作为空模块(占位符)

稍后在同一导入链中,在文件
source/preparation/features/get\u qualified\u edges.py
中,行

来自Sources.Preprocessing.convertion导入转换器

尝试从预处理模块导入
convertion
,但它会找到一个空模块(因为它仍在导入过程中),因此找不到相应的名称(
convertion
).

您的导入结构很复杂,因此很难确定,但我怀疑您的模块A导入了B,B(直接或间接)导入了A。A在其
import B
语句后定义了B需要的函数。Python中的导入是可执行语句,因此当要求导入B时,解释器暂停处理A。这可能意味着导入B时A中所需的
def
尚未处理。我理解你的观点,但这如何适用于我的情况?查看以这种方式从Sources.Preprocessing.convertion导入Converter添加时导致错误的行。convertion.py不导入任何内容。所以在我的例子中,并没有你们所说的任何直接或间接的循环。导入刚刚在convertion.py结束。我相信我的问题需要稍微不同的解决方案。我认为
来自Sources.Preparation.Features.get\u qualified\u edges import…
来自
预处理/apply\u预处理.py
是导致导入问题的主要原因。看着那些鹬,准备/功能/\uuuu Init\uuuuuuuuuuuu.py的
from.get\u qualified\u edges import*
最终创建导入链导致预处理/应用预处理的
from Sources.preparation.features.get\u qualified\u edges import…
您应该重构
准备\功能\获取\u qualified\u edges.py
或使用建议的本地进口的方法。至于它只在Sources.Preprocessing.convertion import Converter
的附加
中抛出错误的原因,这是因为现代python将允许循环导入,当它发生时