在檔案系統上組織**,並確保每個目錄都定義了乙個__init__.py檔案
from . import png
將檔案合併成乙個單一的邏輯命名空間,後續就可以直接使用from graphics.formats import jpg,png
from module import *
會匯入檔案中所有不以下劃線開頭的內容,因此應該避免使用這種形式。
# somemodule.py
def spam():
pass
def grok():
pass
blah = 42
# only export 'spam' and 'grok'
__all__ = ['spam', 'grok']
如果定義了__all__
, 那麼只有被列舉出的東西會被匯入,如上例中的【『spam』, 『grok』】函式。
mypackage/
__init__.py
a/__init__.py
spam.py
grok.py
b/__init__.py
bar.py
包匯入分相對路徑匯入和絕對路徑匯入,相對路徑匯入避免了絕對路徑將頂層包名硬編碼到你的原始碼中:
注意:絕對路徑匯入:使用點的這種模式從不是包的目錄中匯入將會引發錯誤
因為主模組的名字總是
__main__
,python 應用程式的主模組應該總是用絕對匯入,所以在有from . import
的檔案中執行會報錯cannot import name '***' from '__main__': ***
如果模組mypackage.a.spam
要匯入同目錄下的模組grok,from mypackage.a import grok
包中包含**需要讀取的資料檔案。你需要盡可能地用最便捷的方式來做這件事
mypackage/
__init__.py
somedata.dat
spam.py
現在假設spam.py檔案需要讀取somedata.dat檔案中的內容。你可以用以下**來完成,由此產生的變數是包含該檔案的原始內容的位元組字串。
# spam.py
import pkgutil
data = pkgutil.get_data(__package__, 'somedata.dat')
要讀取資料檔案,你可能會傾向於編寫使用內建的i/ o功能的**,如open()。但是這種方法也有一些問題:
import 已存在的.py報錯時,一般因為它所在的目錄不在sys.path裡,新增工作目錄一般有兩種形式:
pythonpath環境變數來新增
import sys
print(sys.path) #檢視路徑是不是在工作目錄中
from os.path import abspath, join, dirname
sys.path.insert(0, join(abspath(dirname(__file__)), 'src'))
使用模組級的變數來精心構造乙個適當的絕對路徑,有時你可以解決硬編碼目錄的問題,比如__file__。建立乙個.pt**件,將目錄列舉出來,這個.pt**件需要放在某個python的site-packages目錄
/some/dir
/other/dir
參考:
Python 高階 模組 包
命名空間和變數作用域的比較 變數名的查詢覆蓋 匯入模組 模組匯入的特性 模組內建函式 package 包 預設的模組搜尋路徑在 python 解析器編譯安裝時被指定,我們可以通過 sys 模組來檢視和修改它 in 4 sys.path out 4 usr bin usr lib python2.7 ...
高階python 包 和模組
包 簡單而言,包就是資料夾,用來存放檔案。模組 檔案或檔案的集合 python中 和is 的區別 主要 判斷的是兩個變數的值 is 用來判斷兩個變數的記憶體位址 引用傳遞僅僅是資料的引用 is 主要 呼叫的是的是 ip位址 深淺拷貝 1 匯入 copy import copy b copy。copy...
Python經典高階 模組 2
這個模組實現了特定目標的容器,以提供python標準內建容器 dict list set tuple 的替代選擇。類名作用 ordereddict 字典的子類,保留了他們被新增的字典物件的順序 counter 字典的子類,提供了可雜湊物件的計數功能 defaultdict 字典的子類,提供了乙個工廠...