python-導包

     一個python文件就是一個模塊,使用獨立的命名空間,但實際使用過程中單單用模塊來定義python功能顯然還不夠。因爲一個大型的系統幾千上萬個模塊是很正常的事情,如果都聚集在一起顯然不好管理並且有命名衝突的可能,因此python中也出現了一個包的概念。

一、python中的包介紹

      包是通過使用“點模塊名稱”創建Python模塊命名空間的一種方法。列如,模塊名稱 A.B 表示一個在名爲 A的包下的名爲B的子模塊。就像使用模塊讓不同模塊的作者無需擔心彼此全局變量名稱(衝突)一樣,點模塊名稱讓多模塊包的作者無需擔心彼此的模塊名稱(衝突)。模塊包在文件系統中的表示就是一系列目錄的集合,通過目錄的層級結構形成模塊包的層級結構,最終的模塊文件就位於最後的目錄中。比如定義一個簡單的模塊在包pkg下,那麼執行如下步驟:

1、在D:\temp目錄下建立一個目錄,名稱是pkg

2、在pkg下建立一個__init__.py的模塊,內容爲空即可

3、在pkg目錄下建立一個python模塊module_3.py,內容如下:

# -*- encoding:utf-8 -*-'''pkg.module_3.py模塊的內容''' print("Hello World") def func1():print("This is funciton one")

      注意第2步,必須要在每一個包目錄下建立一個__init__.py的模塊,這個是python的規定,用來告訴python解釋器將該目錄當成一個內容包,即該目錄是一個包,裏面包含了python模塊的。這個是必須的,如果不指定,則我們在python的交互模式下導入module_3.py這個模塊時會報如下錯誤:

>>> import pkg.module_3Traceback (most recent call last):File "<stdin>", line 1, in <module>ImportError: No module named pkg.module_3

      因此包目錄下的__init__.py模塊是必須的,但內容是可選的,可以爲空內容,也可以寫一些代碼或作其他用途。PVM在導入某個包下的模塊時會先導入這個包下的__init__.py模塊,比如我們將__init__.py模塊的內容指定如下:

print("This is __init__ module")

      然後在交互模式下重新導入這個包,則效果如下:

>>> import pkg.module_3This is __init__ moduleHello World>>>

      可見,PVM首先加載的是__init__.py模塊,然後纔是找該目錄下的其他模塊並進行加載。

二、python中的模塊搜索路徑

      在一個模塊被導入時,PVM會在後臺從一系列路徑中搜索該模塊,其搜索過程如下:

1、在當前目錄下搜索該模塊;

2、在環境變量PYTHONPATH中指定的路徑列表中依次搜索;

3、在python安裝路徑中搜索

      事實上,PVM通過變量sys.path中包含的路徑來搜索,這個變量裏面包含的路徑列表就是上面提到的這些路徑信息,我們可以打印看下sys.pth都包含些哪些路徑:

>>> import sys>>> print(sys.path)['', 'C:\\Windows\\system32\\python27.zip', 'D:\\tools\\Python27\\DLLs', 'D:\\tools\\Python27\\lib', 'D:\\tools\\Python27\\lib\\plat-win', 'D:\\tools\\Python27\\lib\\lib-tk', 'D:\\tools\\Python27', 'D:\\tools\\Python27\\lib\\site-packages','D:\\tools\\Python27\\lib\\site-packages\\wx-2.8-msw-unicode']

      不同的機器上顯示的路徑信息可能不一樣,但至少都包含上面提到的3點。知道了這個路徑搜索規律後,我們就可以很方便的將某些目錄動態的增加到搜索路徑中去,比如在E盤下建立一個python模塊module_4.py,內容如下:

print("Hello world")print 2 ** 2

      然後在交互模式下執行導入:

>>> import module_4Traceback (most recent call last):File "<stdin>", line 1, in <module>ImportError: No module named module_4

      報錯是預料中的,因爲E盤並不在python模塊的搜索路徑中,然後我們動態的增加這個路徑到搜索模塊中,再執行導入:

>>> sys.path.append("E:\\")>>> print(sys.path)['', 'C:\\Windows\\system32\\python27.zip', 'D:\\tools\\Python27\\DLLs', 'D:\\tools\\Python27\\lib', 'D:\\tools\\Python27\\lib\\plat-win', 'D:\\tools\\Python27\\lib\\lib-tk', 'D:\\tools\\Python27', 'D:\\tools\\Python27\\lib\\site-packages','D:\\tools\\Python27\\lib\\site-packages\\wx-2.8-msw-unicode', 'E:\\']>>> import module_4Hello world4

      首先是在sys.path中增加了E盤根目錄作爲搜索路徑,隨後的打印中可以看到確實已經被添加到sys.path中去了,然後再執行導入就會正常導入模塊並執行模塊中的語句了。當然,我們通過交互模式新增加的搜索路徑也僅僅是在當前交互模式下有效,一旦退出了那麼就就失效了。因此,我們可以根據搜索路徑規則的第2步中說的來設置PYTHONPATH環境變量就可以滿足不同使用情況下都可以找到模塊了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章