簡體   English   中英

Python 子模塊在 python 3.7 但不是 3.6 中正確導入

[英]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 f2from 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM