【循序漸進學Python】10.模塊和包


1.導入模塊

任何Python程序都可以作為模塊導入,只要Python解釋器能找到我們定義的模塊所在位置即可,一般來講,在一個模塊被導入時,Python解釋器會按照下面的步驟進行搜索:

  • 在當前所在目錄下搜索這個模塊
  • 在環境變量 PYTHONPATH 中指定的路徑列表中依次搜索
  • 在Python安裝路徑中去搜索

根據Python的搜索路徑的方式,想讓Python解釋器找到自定義的模塊可以使用下面的三種方式(不包含模塊在當前目錄的方式):

1.1 將模塊放置在默認的目錄

Python解釋器會在默認目錄中查找需要使用模塊,使用 sys 模塊的 path 變量即可查看解釋器默查找的目錄,如下:

 1 import sys
 2 import pprint
 3 
 4 pprint.pprint(sys.path)   
 5 # output:
 6 # ['C:\\Users\\gyzhao\\Desktop',
 7 #  'C:\\Python27\\lib\\site-packages\\distribute-0.6.27-py2.7.egg',
 8 #  'C:\\Windows\\system32\\python27.zip',
 9 #  'C:\\Python27\\DLLs',
10 #  'C:\\Python27\\lib',
11 #  'C:\\Python27\\lib\\plat-win',
12 #  'C:\\Python27\\lib\\lib-tk',
13 #  'C:\\Python27',
14 #  'C:\\Python27\\lib\\site-packages',
15 #  'C:\\Python27\\lib\\site-packages\\setuptools-0.6c11-py2.7.egg-info']

 一般情況下應該存放到 site-packages 目錄中,這里用於存放標准庫外的第三方模塊。

1.2 在程序中直接設置模塊目錄

我們在任意位置創建一個文件夾,用於存放自定義的模塊,這里是 C:/Python ,在這個目錄中新增一個 Hello.py 文件,內容如下:

# hello.py
def hello():
    print "hello,world!"

 同樣的通過將模塊所在的目錄添加到 sys 模塊的 path 變量中即可,這樣就可以使用這個模塊中定義的函數:

import sys
sys.path.append('c:/python')
import hello

hello.hello() # hello,world!

 1.3 修改環境變量

還可以通過修改環境變量,來告知Python解釋器自定義模塊的位置:

我的電腦 --> 屬性 --> 高級 --> 環境變量 

添加 PYTHONPATH 變量,多個目錄使用;分開即可,如下:

這樣我們就可以直接使用hello模塊了:

import hello

hello.hello() # hello,world!

 1.4 補充:Sublime Text下環境變量的配置

如果使用使用Sublime Text來編寫Python代碼的話,使用第三種方式,即修改 PYTHONPATH 變量的方式,在 Ctrl+B 運行代碼時,會找不到環境變量里面聲明路徑中定義的模塊,這是Sublime Text自身的問題,因為不管使用使用Python自帶的IDLE,還是CMD來執行代碼,都是可以通過 PYTHONPATH 變量來找到其聲明路徑中的模塊的,如果想要在Sublime Text中通過環境變量來使用第三方模塊的話需要顯式的在Sublime Text的 Python.sublime-build 文件中聲明,步驟如下:

Preferences --> Browse Packages... --> 找到Python文件夾 --> 打開Python.sublime-build文件

 將將路徑添加到env屬性中,多個路徑使用;分隔,修改如下:

{
    "cmd": ["python", "-u", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python",
    "env":{
        "PYTHONPATH":"C:\\Python;"
    }
}

 2. 在模塊中增加測試代碼

有時候我們需要在模塊中添加測試代碼,可以直接執行檢測模塊是否正確工作。但是在程序作為模塊被其他程序引用時,不執行這些測試代碼,通過使用 __name__ 變量我們可以很容易的實現這點:

 1 # -- coding: utf-8 --
 2 
 3 def hello():
 4     print "hello,world!"
 5 
 6 def test():
 7     hello()
 8 # 如果作為程序運行,Hello函數會被執行,
 9 # 作為模塊時不執行,因為這時:__name__ = hello
10 if __name__ == '__main__': test()

3. 了解模塊具體內容

在使用一個模塊前,我們應該首先去了解這個模塊的具體內容,這樣能節省很多的時間,避免在沒有了解模塊具體內容的情況下,盲目的編寫代碼。使用下面的幾種辦法可以讓我們很快的對一個模塊建立大體的印象。

3.1 使用dir

查看模塊包含的內容可以使用 dir 函數,它會將對象(模塊所有函數、類、變量等)的所有特性列出來,如下:

 1 # -- coding: utf-8 --
 2 import sys
 3 
 4 # 通過列表推導式過濾內部成員
 5 publicMembers = [n for n in dir(sys) if not n.startswith('_')]
 6 
 7 for m in publicMembers:
 8     print m+''
 9 
10 # output
11 # api_version
12 # argv
13 # ...

 3.2 使用all變量

__all__ 變量定義了模塊的公有接口(public interface),如下:

# -- coding: utf-8 --
import copy

# output: ['Error', 'copy', 'deepcopy']
print copy.__all__

 __all__變量等於告訴解釋器:從模塊導入所有內容(使用 * )時,即下面的形式:

from copy import *

 那就只能使用 __all__ 定義的函數。如果使用__all__沒有定義的成員,只要顯式的導入即可。如果導入的模塊沒有定義 __all__ 變量,使用 import * 語句默認將會輸出模塊中所有不以下划線(_)開頭的全局名稱。

3.3 查看文檔字符串

通過 __doc__ 變量,我們可以查看一個 range 函數的文檔字符串:

# -- coding: utf-8 --
print range.__doc__

 不是每個模塊和函數都有清晰的文檔字符串,如果想要更清楚的了解一些模塊和函數時如果工作的,應該參閱Python庫參考(http://docs.python.org/2/library/index.html),這里有更標准、詳盡的信息。

3.4 使用help獲取幫助

help函數和之間檢測文檔字符串相比,help函數能獲取更多的信息,比如函數簽名等:

# -- coding: utf-8 --
import copy

print help(copy.copy)

 3.5 閱讀源代碼

除了自己動手編寫代碼外,閱讀源代碼是學習Python最好的方式。如果想要查看一個模塊的源碼位置,可以這樣:

# -- coding: utf-8 --
import csv

print csv.__file__ # C:\Python27\lib\csv.pyc

 查詢處理的文件是.pyc后綴結尾的文件,這是一個經過Python解釋器處理后生成的字節碼文件,我們只需要查看對於的以.py后綴結尾的源文件即可。

 4. 組織模塊的形式——包

為了進一步的組織好模塊,可以將它們分組為包。包基本上就是一類模塊。當模塊存儲在文件中時,包就是模塊所在的目錄。為了能夠讓Python解釋器將其作為包來對待,它必須包含一個命名為__init__.py的文件( __ init__.py 可以只是一個空文件,但是它也可以執行包的初始化代碼,包括設置__all__變量等)。如果將它作為普通模塊導入的話,文件的內容就是包的內容。

下面是一個簡單的包布局,包名為"drawing",其中包含名為"color"和"shapes"的模塊:

C:\Python # 存放模塊的路徑
C:\Python\drawing #包目錄(drawing包)
C:\Python\drawing\__init__.py # 包代碼
C:\Python\drawing\colors.py # colors模塊
C:\Python\drawing\shapes.py # shapes模塊

 配置好包之后,可以按照以下方式導入包的內容:

# -- coding: utf-8 --
import drawing # 導入drawing包
import drawing.colors # 導入drawing包的colors模塊
from drawing import shapes # 導入drawing包的shapes模塊

5. 使用包管理工具——pip

pip 是一個用來管理Python包的工具。我們可以利用它來幫助我們安裝、升級、卸載Python的第三方擴展包。

1. 安裝pip

首先需要下載get-pip.py這個文件,然后在控制台中使用Python命令來運行這個文件,即可進行安裝:

python get-pip.py

更多安裝的細節可以參考:https://pip.pypa.io/en/latest/installing.html

2. 配置環境變量

安裝完pip之后,我們可以在Python的安裝根目錄下面看一個Scripts文件夾,這時候我們將該文件的磁盤路徑,例如:

C:\Python27\Scripts

添加到系統的Path環境變量中即可。

3. 管理包(安裝、升級、卸載)

配置了環境變量之后,我們就可以在控制台中運行pip命令來對包進行管理了,例如:

pip install SomePackage # 安裝一個包
pip install --upgrade SomePackage # 升級一個包
pip uninstall SomePackage # 卸載一個包

更多pip的使用細節,可以參考:https://pypi.python.org/pypi/pip/

 

參考資料&進一步閱讀

Python基礎教程(第二版)

http://docs.python.org/2/using/windows.html

http://stackoverflow.com/questions/3701646/how-to-add-to-the-pythonpath-in-windows-7

http://docs.sublimetext.info/en/latest/reference/build_systems.html

https://pypi.python.org/pypi/pip/

                                        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM