我想了解问题的根源。我已经遇到过几次了,每次弄清楚都是很耗时的。
这一次,我感觉好像错过了一些我认为自己理解的东西。 一个相关的问题发布在这里:Infinite loop with Python imports; looking for Pythonic way
我确定我的模块存在无限循环,但仍然出现相同的错误。所以这就是我所拥有的。
我也在此处包括//I Want to get 2 values through Url. n1 and n2 and pass to getsheetvalues.
function doGet(e)
{
var sheet = SpreadsheetApp.openById('Google Secret key').getSheetByName('Google');
var b1 = sheet.getSheetValues(e.parameters.n1, 23, 1 , e.parameters.n2);
return ContentService.createTextOutput(b1);
)
个文件,因为我怀疑该文件可能会导致我目前不知道的行为。
在__init__.py
中:
sources/preparation/features/__Init__.py
在from .build_features import *
from .get_qualified_edges import *
from .select_strategy import *
from .test import *
中,我有:
sources/preprocessing/__init__.py
在from .apply_preprocessing import *
from .convertion import *
中,我有:
sources/preprocessing/apply_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_qualified_edges.py
在from Sources.Preprocessing.convertion import Converter # added this lien causes error to be raised
from itertools import combinations
中,我没有任何导入。
以下是由于出现错误而运行的文件的顺序:
Sources/preprocessing/conversion.py
当我从sources\__init__.py
sources\preparation\__init__.py
sources\prepartion\features\__init__.py
sources\preparation\features\build_features.py
sources\preparation\features\get_qualified_edgdes.py
sources\preprocessing\__init__.py
sources\preprocessing\apply_preprocessing.py
\\error raise
导入一个类时,将引发错误,如下所示。在Sources.Preprocessing.convertion
中:
source/preparation/features/get_qualified_edges.py
让我知道您是否需要有关此问题的更多信息。
我想知道的是:为什么会出现此问题?
当我将from Sources.Preprocessing.convertion import Converter # added this lien causes error to be raised
从Converter
移到Sources.Preprocessing.convertion
时,我解决了这个问题。
我观察到的是,当Sources.Preparation.Data.conversion
(导入Sources.Preprocessing.modules_A
)和Sources.Preparation.modules_C
(导入Sources.Preparation.modules_B
)之间没有“交叉”导入时,错误消失了。
就是这样。在各个模块之间没有直接的“交叉”导入,而在父模块之间没有“交叉”导入。
答案 0 :(得分:1)
问题在于您正在从文件中引入循环导入。
对于sources/preprocessing
中的文件,您正在从source/preparation
导入内容。但是这些文件又从source/preprocessing
导入内容。
一旦您拥有类似
的导入链A.py-> B.py-> C.py-> B.py -> E.py
(直接循环)
或
A.py-> B.py-> C.py-> D.py-> B.py -> E.py
(间接循环)
然后它将无法继续导入模块,因为它不可能终止。
在python中克服此问题的一种简单方法是使用本地导入。
例如,代替
from Sources.Preprocessing.convertion import Converter
# more code.....
class A:
def foo():
bar = Converter()
您可以改为使用本地导入
# more code.....
class A:
def foo():
from Sources.Preprocessing.convertion import Converter
bar = Converter()
,使得它仅在实际使用对象之前导入。这样可以避免一开始就导入所有内容,从而避免了循环导入。
编辑:
简而言之,要回答OP关于这个特定问题的问题:
您在代码中的某处启动了预处理模块的导入。 (可能在sources\preparation\features\get_qualified_edgdes.py
中?不太确定)
目前,预处理已添加到sys.modules
命名空间,但作为一个空模块(占位符)。
稍后在同一导入链中的文件source/preparation/features/get_qualified_edges.py
中的行
from Sources.Preprocessing.convertion import Converter
尝试从 Preprocessing 模块导入convertion
,但是它会找到一个空模块(因为它仍在导入过程中),因此无法找到相应的名称({ {1}})。