Python 3.x 导入模块会导致错误,但将模块一分为二然后导入不会导致';t、 为什么??
我试图自己找出如何解决我最近提出的问题,我发现了一个潜在的解决方案,但我真的不明白为什么它有效,为什么另一个不行 对于上下文,Python 3.x 导入模块会导致错误,但将模块一分为二然后导入不会导致';t、 为什么??,python-3.x,tensorflow,tf.keras,Python 3.x,Tensorflow,Tf.keras,我试图自己找出如何解决我最近提出的问题,我发现了一个潜在的解决方案,但我真的不明白为什么它有效,为什么另一个不行 对于上下文,model要求在模块中成功加载和定义变量a和b。否则,它将抛出一个错误:name错误:未定义名称“a” 从model.py开始: 导入pickle 从tensorflow进口keras #加载并返回模型所需的变量 def load_model_vars(): 返回pickle.load(打开('./file.pkl',rb')) #加载并返回模型 def load_模型(
model
要求在模块中成功加载和定义变量a
和b
。否则,它将抛出一个错误:name错误:未定义名称“a”
从model.py开始:
导入pickle
从tensorflow进口keras
#加载并返回模型所需的变量
def load_model_vars():
返回pickle.load(打开('./file.pkl',rb'))
#加载并返回模型
def load_模型():
返回keras.models.load_model('./model.h5')
现在,为了尽可能少地再现和识别问题,我创建了一个新模块,foo.py
:
从模型导入加载模型变量,加载模型
#这里的目标是假定只向其他模块公开模型
a、 b=负载\模型\变量()
globals()['model']=load_model()
然后,我创建了另一个模块来导入foo.py
,我们把它命名为bar.py
:
导入foo
#只需检查模型是否已定义
foo.model.summary()
出于某种原因,它抛出前面提到的namererror
。为什么?变量是被定义的,它是按顺序执行的(首先加载变量,然后是模型),即使我将a,b
更改为globals()['a'],globals()['b']
,import foo
更改为from foo import*
或从foo import a,b
更改为,甚至更改为任何这些变量的组合,它总是会出现此错误
但当我介绍另一个模块时,比如说,baz.py
,它包含以下两行:
从模型导入加载模型变量
a、 b=负载\模型\变量()
然后将其导入到bar.py
:
从baz导入a、b
进口食品
#只需检查模型是否已定义
foo.model.summary()
如果foo.py
保持不变,或者a,b=load\u model\u vars()
注释掉:
从模型导入加载模型变量,加载模型
#这里的目标是假定只向其他模块公开模型
#a,b=负载\模型\变量()
globals()['model']=load_model()
它成功地加载了这个奇怪的模型!为什么?导入功能下面的魔法是什么?引擎盖下到底发生了什么