问问题
8812 次
2 回答
7
我可以说明导致每个之间差异的原因import
,但我对 Python 的导入过程不够专业,无法很好地解释原因。
>>> import sys
>>> before_import = set(sys.modules.keys())
>>> import mypkg
imported module_a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "mypkg\__init__.py", line 2, in <module>
yarg ## cause import error
NameError: name 'yarg' is not defined
>>> after_import = set(sys.modules.keys())
>>> after_import.difference(before_import)
set(['mypkg.module_a'])
当您import mypkg
成功导入module_a
并将其添加到sys.modules
. 然后mypkg
错误并且不会被添加到sys.modules
字典中。删除该条目允许您重新导入,但出现相同的错误:
>>> import sys
>>> del sys.modules['mypkg.module_a']
>>> import mypkg
imported module_a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "mypkg\__init__.py", line 2, in <module>
yarg ## cause import error
NameError: name 'yarg' is not defined
现在,我认为正在发生的是:
import mypkg
开始导入过程mypkg
在处理过程
mypkg
中,它成功地将其作为自身的子包导入module_a
并将其添加到sys.modules
当它遇到错误时,导入过程失败并且没有留下
mypkg
任何条目mypkg
sys.modules
包失败但子包成功的结合与后续导入冲突
这是我能理解的最好的,对不起。Python 的导入过程是一种魔法。
于 2012-10-11T02:58:12.410 回答
2
我很确定问题是您的包无法加载。您yarg
在文件中添加了一些废话(单独)__init__.py
。这意味着mypkg
无法导入。因此,mypkg.module_a
也无法导入。
我怀疑你会得到不同的错误,因为 Python 正在对模块状态进行一些缓存。第一次尝试导入mypkg
其子模块的导入module_a
是允许的,即使mypkg
正在加载。mypkg
第二次,无法正常工作的事实被缓存,因此mypkg.module_a
由于其父包损坏而无法加载。
于 2012-10-11T02:50:23.017 回答