Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 两次尝试导入损坏的包时,导入错误_Python_Python 3.x - Fatal编程技术网

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'>