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将允许循环导入,当它发生时