我正在使用Python 2.7。Python子模塊:「導入爲」與「導入」
這是我的文件夾結構。 (temp
已添加到此係統路徑中。)
temp
|
|--main.py
|
|--sub
|
|--__init__.py
|
|--sub2
|
|--__init__.py
|
|--square.py
文件內容如下所示。
main.py:
import sub.sub2 as sub2
sub2.run()
sub/__init__.py: empty
sub/sub2/__init__.py:
import sub.sub2.square as square
def run():
square.square_it(3)
sub/sub2/square.py:
def square_it(x): return x**2
當我執行main.py
,我收到以下錯誤(忽略行號):
Traceback (most recent call last):
File "main.py", line 3, in <module>
import sub.sub2 as sub2
File "/home/gimlisonofgloin1/temp/sub/sub2/__init__.py", line 3, in <module>
import sub.sub2.square as square
AttributeError: 'module' object has no attribute 'sub2'
,我可以通過改變發生於任何這些語句的錯誤的語句解決這個問題(在最後三級所列的解決方案,我要適當地改變函數調用,當然):
from sub.sub2 import square as square
;from sub.sub2.square import square_it
;from .square import square_it
(正如用戶NeErAj KuMaR的回答中所指出的那樣);或import sub.sub2.square
。
我的問題是:爲什麼原來的行代碼產量錯誤的,即使它是語義上等同於工作(「固定」)的代碼行(特別是第一和第四列出的解決方案) ?
在試圖回答這個問題,我已經越過該位文本跌跌撞撞從Python 2.0 Reference Manual:
爲了避免混淆,你不能導入子模塊「作爲」一個不同的本地名稱。所以'import module as m'是合法的,但'import module.submod as s'不是。後者應該寫成'從模塊導入子模式爲s',見下文。
這與我收到的錯誤一致。然而,這個(看似重要的)小小的街區並不存在於Python 2.7 Reference Manual的任何地方。那麼Python 2.0引用中的小小事件仍然適用於Python 2.7嗎?或者我得到這個錯誤的原因完全不同,我不知道?
您錯過了臨時目錄中的__init__py。 – Dharmesh
哎呦。我的意思是說'temp'已經在Python路徑中,這意味着''temp''不需要'__init __。py'文件。編輯的問題來反映這一點。 –