Python 两次尝试导入损坏的包时,导入错误
我在两次尝试导入破损的包时注意到一个奇怪的行为。让我们考虑下面的包:Python 两次尝试导入损坏的包时,导入错误,python,python-3.x,Python,Python 3.x,我在两次尝试导入破损的包时注意到一个奇怪的行为。让我们考虑下面的包: | package |--| __init__.py |--| module1.py module1.py为空且\uuuuu init\uuuuu.py包含: from package import module1 from package import module2 在第一次尝试导入程序包时,由于缺少模块2,会引发一个导入错误: >>> import package Traceback (most r
| package
|--| __init__.py
|--| module1.py
module1.py
为空且\uuuuu init\uuuuu.py
包含:
from package import module1
from package import module2
在第一次尝试导入程序包
时,由于缺少模块2
,会引发一个导入错误
:
>>> import package
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/tmp/package/__init__.py", line 2, in <module>
from package import module2
ImportError: cannot import name 'module2'
即使以前已成功导入模块1
。它甚至可以在系统模块中使用:
>>> import sys
>>> sys.modules["package.module1"]
<module 'package.module1' from '/tmp/package/module1.py'>
导入系统
>>>系统模块[“package.module1”]
然而,这在Python3.5中似乎是固定的,可能是因为
到底发生了什么?第一次,导入了
包.module1
,从此存在于sys.modules
中。但是,由于package.module2
上的导入错误,package
本身的导入没有成功,因此,package
不会在sys.modules
中结束
第二次尝试导入程序包
将以不同的方式处理程序包.module1
的导入,因为它已经存在于系统模块
中。这一次的代码路径假定在某个点上,如果在sys.modules
中存在一个带点名称的模块,那么所有父模块也都会这样做。然而,在第一次尝试导入包失败后,这一假设没有得到满足
简言之,导入一个包(可能会导致导入更多的包和模块)对于填充sys.modules
,不是原子的,而Python 3.4之前的一些假设需要原子性
>>> import sys
>>> sys.modules["package.module1"]
<module 'package.module1' from '/tmp/package/module1.py'>