前言
關於python包的一些知識
Java中的package概念
我們知道在java中的import package概念, java中的包就是一個目錄,里面包含着子目錄,子目錄套着子目錄,當需要引入下層包的時候,需要加一個點以表示分層的概念例如
├─ aaa
├─bbb
│ └─ccc
└─ddd
我們在根目錄下,當我們想引用ccc中的ccc中的class的時候,我們可以這樣寫
import bbb.ccc.*
Python中的包
總體來說python的包機制與Java的差不多,都是目錄的形式,不過里面都是py文件
一個標准的Python包
一個標准的Python Package A 應該至少在A目錄下包含__init.py__ 文件,例如
sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
這樣的sound包中包含了了3個包,首先sound目錄下有_init_.py文件,sound包中包含formats, effects和filters三個包,formats,effects 和filters。 init.py的作用主要是在import python的包的時候做一些初始化工作例如可以這樣寫
__all__ = ['wavread', 'wavwrite']
如果在formats的init里面寫了這句話,表明from sound.formats import * 的時候, 只會引入wavwrite, wavread兩個Module。
其他py文件對Module的引用
引用python包的語法主要有兩種
import sound
或者
from sound.formats import func
對於第一種寫法,表明引入的是整個module,接下來可以使用sound.format.func, 對於第二種寫法,from后面必須精確到某個py文件,import表示引入py文件中的某個對象(或是某個類和函數,當然python中函數也是對象)注意,這么寫是相對路徑,也就是說,能不能引入到你想要的包,和你當前py文件在哪個包很有關系,例如現在在echo.py中想引入formats/wavread.py中的func,必須這么寫
from ..formats.wavread import func
func()
參考了這篇博文后需要注意,含有相對路徑的py文件是不能直接運行的(包括直接python echo.py或是在sublime中cntl + B等等方法),原因是直接執行python腳本會讓該腳本的_name__值變成_main__會影響到相對路徑的引用,報錯__Attempted relative import in non-package,因此,若是一定需要執行某腳本,必須手動的將當前目錄的上層引入,代碼如下
import sys
sys.path.append('../')
from ..formats.wavread import func
func()
這樣就可以直接運行
待續未完。。。
