这里有一个神秘的python问题:
我正在开发一个python包,它偶尔会报告类似于ImportError: cannot import name …
的导入错误。通常无法导入的模块
通过这个简单的例子,我可以重现类似的效果:
mypkg/__init__.py
:
from . import module_a
yarg ## cause import error
mypkg/module_a.py
:
print "imported module_a"
现在我将尝试导入包两次。请注意,第二次导入时错误会发生变化:
>>> import mypkg
Module A imported
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "mypkg/__init__.py", line 2, in <module>
yarg
NameError: name 'yarg' is not defined
>>> import mypkg
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "mypkg/__init__.py", line 1, in <module>
from . import module_a
ImportError: cannot import name module_a
给什么?
注意:
sys.modules['mypkg.module_a']
,那么第二次导入将返回原始错误消息
我很确定问题是你的包无法加载。你在
__init__.py
文件中放了一些废话(yarg
)。这意味着mypkg
无法导入。因此,mypkg.module_a
也不能导入。我怀疑您会得到不同的错误,因为Python正在缓存模块状态。第一次尝试导入
mypkg
时,即使mypkg
正在加载,也允许导入其子模块module_a
。第二次,缓存了mypkg
无法正常工作的事实,因此mypkg.module_a
无法加载,因为其父包已损坏。我可以说明是什么导致了每个
import
之间的差异,但是我在Python的导入过程方面不够专业,无法很好地解释为什么。当您
import mypkg
时,它成功地导入module_a
,并将其添加到sys.modules
。然后mypkg
错误和不会被添加到sys.modules
字典中。删除条目后,您可以重新导入时出现相同的错误:现在,我认为正在发生的是:
import mypkg
启动mypkg
的导入过程在处理
mypkg
时,它成功地将module_a
导入为 自身的子包并将其添加到sys.modules
当它命中错误时,
mypkg
的导入过程失败并且没有mypkg
的条目留在sys.modules
包的连接失败,但子包成功 与后续导入冲突
对不起,这是我能理解的最清楚的了。Python的导入过程是一种黑色艺术。
相关问题 更多 >
编程相关推荐