我遇到了一个我不明白的错误,我设法将其归结为这个错误。这是目录结构:
temp
temp2
__init__.py
mod.py
mod2.py
以下是文件的内容:
#__init__.py
from temp.temp2.mod import *
from temp.temp2.mod2 import *
#mod.py
def f():
pass
#mod2.py
import temp.temp2.mod as mod
然后我在ipython中打开一个新的python 3.6.8控制台,并尝试加载mod2,我得到了:
>>>import temp.temp2.mod2
Traceback (most recent call last):
File "<ipython-input-1-...>", line 1, in <module>
import temp.temp2.mod2
File ".../temp/temp2/__init__.py", line 2, in <module>
from temp.temp2.mod2 import *
File ".../temp/temp2/mod2.py", line 1, in <module>
import temp.temp2.mod as mod
AttributeError: module 'temp' has no attribute 'temp2'
其他一些事实。
首先,如果我将文件mod2.py
更改为import temp.temp2.mod
或from temp.temp2.mod import f
,那么它将正常工作且没有错误。只有import as
会导致错误。
第二,如果我没有嵌套的模块,只需将mod.py
,mod2.py
和__init__.py
放在temp
内(并相应地更改导入),那么我也没有任何错误。
知道发生了什么吗?
Attribute not added to module after importing对正在发生的事情作了部分解释。 temp
没有属性temp2
的原因是程序包temp.temp2
目前仍在加载,而程序包temp2
中的属性temp
尚未设置直到此加载完成之后。但是它仍然无法回答有关import
和import as
为何导致不同行为的问题。
重申一下,这是唯一导致错误的mod2.py
文件:
#mod2.py -- results in error
import temp.temp2.mod as mod
这些都可以正常工作:
#mod2.py -- works OK
import temp.temp2.mod
#mod2.py -- works OK
from temp.temp2.mod import f
#mod2.py -- works OK
from temp.temp2 import mod
#mod2.py -- works OK
from temp.temp2 import mod as mod
因此,至少对我而言,包temp2
中的属性temp
在加载temp.temp2
之后才被设置的事实并不能解释为什么这四个版本“ mod2.py”工作,而上面的一个给出了错误。
很显然,我有可以使用的解决方法,但是我想知道导致这种情况发生在幕后的原因,最好是记录在案。我试图找到一些解释模块加载详细信息的文档来解释这种现象,但是我没有找到答案。