11
4

2 回答 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

现在,我认为正在发生的是:

  1. import mypkg开始导入过程mypkg

  2. 在处理过程mypkg中,它成功地将其作为自身的子包导入module_a并将其添加到sys.modules

  3. 当它遇到错误时,导入过程失败并且没有留下mypkg任何条目mypkgsys.modules

  4. 包失败但子包成功的结合与后续导入冲突

这是我能理解的最好的,对不起。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 回答