[英]Python submodule importing correctly in python 3.7 but not 3.6
我的目錄結構如下:
test/
__init__.py
m1/
__init__.py
f1.py
f2.py
test/__init__.py
是空的。
test/m1/__init__.py
包含一行import test.m1.f1
。
test/m1/f1.py
包含一行import test.m1.f2 as f2
。
在 python 3.7.6 中,我可以執行import test.m1
並且一切都按預期工作。 但是,在 python 3.6.9 中,當我嘗試此操作時,出現以下錯誤:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/scratch/test/m1/__init__.py", line 2, in <module>
import test.m1.f1
File "/home/scratch/test/m1/f1.py", line 1, in <module>
import test.m1.f2 as f2
AttributeError: module 'test' has no attribute 'm1'
這看起來很奇怪,因為它不會在import test.m1.f1
上出錯,這是它遇到的第一件事。 它在隨后的import test.m1.f2 as f2
語句中出錯,聲稱test
沒有m1
子模塊。
import test.m1.f2 as f2
嘗試訪問test
模塊 object 的m1
屬性,作為查找 object 以綁定到f2
的過程的一部分。 在 test.m1 子包完成初始化之前不會設置m1
屬性,直到test.m1
的__init__.py
完成執行test.m1
發生。
在 Python 3.7 及更高版本上,如果屬性查找失敗,導入將退回到sys.modules['test.m1.f2']
查找以查找test.m1.f2
。 這種回退在 3.6 上不存在,導致觀察到的差異。
Python 3.5 及更高版本上from
循環導入也存在類似的回退,盡管from. import f2
from. import f2
或from test.m1 import f2
不需要后備。 from
import 直接從sys.modules
檢索test.m1
,因此它只查找f2
屬性,並且該屬性存在。
這不是解釋如何的答案,但它解釋了如何避免錯誤。 對於想要編寫在 3.6 或更早版本下運行的代碼的人來說非常有用。
代替
import test1.m1.f2 as f2
和
from test.m1 import f2
或者正如@alaniwi 指出的那樣
from . import f2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.