最近用sublime text寫python腳本,在導包是一直顯示No module named XXX。
問題描述:
首先文件夾的目錄結構如下:
count.py文件,代碼如下:
1 #coding=utf-8 2 3 def add(a=3,b=8): 4 return a+b 5 6 if __name__ == '__main__': 7 print add()
counttest.py文件,代碼如下:
#coding=utf-8 from model import count c=add(4,6) print c
運行之后,顯示的結果是:
理論上講,從model導入count.py文件,是對的,到底哪里出錯了?
三種解決方案:
(1)在model目錄下新建__init__.py文件,內容為空,在counttest.py文件中更改如下:c=count.add(4,6)
運行結果如下:
(2)在__init__.py文件寫入:
import count
在counttest.py文件更改為:
1 #coding=utf-8 2 3 from model import * #這一行做了更改 4 5 c=count.add(4,6) 6 7 print c
運行結果如下:
(3)在__init__文件中,更改為:
1 #coding=utf-8 2 __all__ = ['count'] #count為需要導入的文件
運行結果如下:
原理:
原來在python模塊的每一個包中,都有一個__init__.py文件(這個文件定義了包的屬性和方法)然后是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那么它就是這個包的子包了。當你將一個包作為模塊導入(比如從 xml導入 dom )的時候,實際上導入了它的 __init__.py 文件。
一個包是一個帶有特殊文件 __init__.py 的目錄。__init__.py 文件定義了包的屬性和方法。其實它可以什么也不定義;可以只是一個空文件,但是必須存在。如果 __init__.py 不存在,這個目錄就僅僅是一個目錄,而不是一個包,它就不能被導入或者包含其它的模塊和嵌套包。
_init__.py 文件:
__init__.py 控制着包的導入行為。假如 __init__.py 為空,那么僅僅導入包是什么都做不了的。
>>> import Package1
>>> Package1.Module1
Traceback (most recent call last):
File "D:/Work Space/Python practice/MyPractice/src/test.py", line 8, in <module>
aa=Package1.Module1
AttributeError: 'module' object has no attribute 'Module1'
我們需要在 __init__.py 里把 Module1 預先導入:
#文件 __init__.py
import Module1
測試:
>>> import Package1
>>> aa=Package1.Module1
>>> print aa
__init__.py 中還有一個重要的變量,叫做 __all__。我們有時會使出一招“全部導入”,也就是這樣:
from PackageName import *
這時 import 就會把注冊在包 __init__.py 文件中 __all__ 列表中的子模塊和子包導入到當前作用域中來。比如:
#文件 __init__.py
__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]
測試:
>>> from Package1 import *
>>>
test1111111111111111111111
test222222
__init__.py 文件會在導入時被執行。