# Python 學習筆記 模塊篇
整理:Jims of [肥肥世家](http://www.ringkee.com)
[jims.yang@gmail.com](mailto:jims.yang@gmail.com)
Copyright ? 2004,2005,2006 本文遵從GNU 的自由文檔許可證(Free Document License)的條款,歡迎轉 載、修改、散布。
發布時間:2004年7月10日
更新時間:2006年03月01日,增加cjkcodecs模塊。
**Abstract**
Python為開發人員提供了豐富的模塊,通過這些模塊,我們就可快速開發出功能強大的程序。本筆記記錄我所接觸或學習過的Python模塊,為想學習Python的朋友提供一個參考。
**Table of Contents**
+ [1\. Python Imaging Library(PIL)](#id2811889)
+ [1.1\. 安裝](#id2811915)
+ [1.1.1\. 下載相關軟件](#id2811923)
+ [1.1.2\. 開始安裝](#id2809722)
+ [2\. Pmw(Python megawidgets)Python超級GUI組件集](#id2809818)
+ [2.1\. 安裝](#id2809843)
+ [2.2\. 模塊功能演示](#id2810164)
+ [2.2.1\. ScrolledListBox(滾動列表框)](#id2810171)
+ [2.2.2\. ScrolledText(滾動文本框)](#id2810195)
+ [3\. PyXML](#id2810219)
+ [3.1\. 安裝](#id2810394)
+ [3.2\. 使用](#id2810431)
+ [4\. PyGame](#id2810447)
+ [5\. PyOpenGL](#id2810462)
+ [6\. NumPy和Numarray](#id2810479)
+ [7\. MySQLdb](#id2810500)
+ [7.1\. 安裝](#id2810521)
+ [7.2\. 模塊功能](#id2810555)
+ [7.3\. 模塊功能演示](#id2861658)
+ [8\. Tkinter模塊](#id2862112)
+ [8.1\. Tkinter簡介](#id2862119)
+ [9\. PyGTK](#id2862133)
+ [9.1\. 安裝](#id2862104)
+ [9.2\. 示例](#id2862080)
+ [10\. PyQt](#id2861697)
+ [10.1\. 安裝](#id2861724)
+ [11\. PyMedia](#id2861855)
+ [12\. Python-ldap](#id2861875)
+ [12.1\. 示例](#id2861891)
+ [13\. ftplib -- FTP protocol client](#id2808494)
+ [13.1\. 示例](#id2808548)
+ [14\. Psyco](#id2808607)
+ [14.1\. 安裝](#id2808658)
+ [15\. smtplib](#id2808709)
+ [15.1\. 示例](#id2808717)
+ [16\. XMPPPY](#id2808780)
+ [16.1\. 示例](#id2808800)
+ [16.2\. cjkcodecs](#id2808819)
## Chapter 1\. Python Imaging Library(PIL)
PIL(Python圖形庫)為python提供強大的圖形處理的能力,并提供廣泛的圖形文件格式支持,當前最新的版本是1.1.4。可到以下網址[http://www.pythonware.com/products/pil/index.htm](http://www.pythonware.com/products/pil/index.htm)了解PIL的最新動態。該庫能進行圖形格式的轉換、打印和顯示。還能進行一些圖形效果的處理,如圖形的放大、縮小和旋轉等。是Python用戶進行圖象處理的強有力工具。
## 1.1\. 安裝
### 1.1.1\. 下載相關軟件
* 到[http://www.pythonware.com/products/pil/index.htm](http://www.pythonware.com/products/pil/index.htm)下載最新版的PIL安裝程序。這里介紹的是在linux下的安裝方法。windows平臺的安裝方法較簡單,只要雙擊安裝程序,就可一步步安裝好了。
* 如果要PIL支持jpeg格式文件,還需安裝jpeg庫文件,可到[http://www.ijg.org](http://www.ijg.org)下載,現時最新的版本是jpegsrc.v6b.tar.gz。
* 如果要PIL支持壓縮功能,還要下載Zlib庫,可到[http://www.gzip.org/zlib/](http://www.gzip.org/zlib/)下載zlib-1.1.4.tar.gz。
### 1.1.2\. 開始安裝
* 先安裝jpeg庫,輸入以下命令進行安裝:
```
tar xfz jpegsrc.v6b.tar.gz
cd jpeg-6b
./configure
make
make test
make install
make install-lib
```
* 接著安裝Zlib庫,輸入以下命令進行安裝:
```
tar xfz zlib-1.1.4.tar.gz
cd zlib-1.1.4
./configure
make
make install
```
* 最后安裝PIL,輸入以下命令進行安裝:
```
tar xfz Imaging-1.1.4.tar.gz
cd Imaging-1.1.4
cd libImaging
./configure
make
cd ..
python setup.py build
python setup.py install
```
* 測試安裝是否成功,可以在Python的命令行界面輸入以下代碼:
```
>>>import Image
>>>im = Image.open("test.jpg")
>>>im.show()
```
如果成功打開test.jpg圖片則安裝成功。注意,在linux中,需要用xv程序來顯示圖片,所以如果沒裝xv,python會提示找不到xv。可到[http://www.trilon.com/xv/downloads.html](http://www.trilon.com/xv/downloads.html)下載xv。
## Chapter 2\. Pmw(Python megawidgets)Python超級GUI組件集
Pmw是一個在python中利用Tkinter模塊構建的高級GUI組件,每個Pmw都合并了一個或多個Tkinter組件,以實現更有用和更復雜的功能。如,Pmw中的一個ScrolledListBox(滾動列表框)實現了Tkinter的Scrollbar(滾動條)和ListBox(列表框)功能,使我們編程更方便。如果你在Python中開發GUI程序,Pmw是將是你的一個好幫手。
## 2.1\. 安裝
現在最新的Pmw是1.2版,Pmw的安裝比較簡單,只要到[http://pmw.sourceforge.net/](http://pmw.sourceforge.net/)下載軟件,然后用tar -zxvf命令解壓文件,把解壓出來的Pmw目錄拷到python的模塊目錄下就可以了,如site-packages 目錄。windows平臺使用同一壓縮包,安裝方法也一樣。安裝完成后可登錄進python的命令行界面運行“import Pmw”測試是否安裝成功,如果沒有出錯信息,則安裝成功,可以使用了。
## 2.2\. 模塊功能演示
### 2.2.1\. ScrolledListBox(滾動列表框)
```
#ScrolledListBox used to select image.
from Tkinter import *
import Pmw
class ImageSelection( Frame ):
"""List of available images and an area to display them"""
def __init__( self, images ):
"""Create list of PhotoImages and Label to display them"""
Frame.__init__( self )
Pmw.initialise()
self.pack( expand = YES, fill = BOTH )
self.master.title( "Select an image" )
self.photos = []
#add PhotoImage object to list photos
for item in images:
self.photos.append( PhotoImage( file = item ) )
#create scrolled list box with vertical scrollbar
self.listBox = Pmw.ScrolledListBox( self, items = images,
listbox_height = 3,
vscrollmode = "static",
selectioncommand = self.switchImage )
self.listBox.pack( side = LEFT, expand = YES, fill = BOTH, padx = 5, pady = 5 )
self.display = Label( self, image = self.photos[0] )
self.display.pack( padx = 5, pady = 5 )
def switchImage ( self ):
"""Change image in Label to current selection"""
#get tuple containing index of selected list item
chosenPicture = self.listBox.curselection()
#configure label to display selected image
if chosenPicture:
choice = int( chosenPicture[0] )
self.display.config( image = self.photos[ choice ] )
def main():
images = [ "c:\python23\logo.gif", "c:\python23\china.gif", "c:\python23\canada.gif", "c:\python23\logo.gif" ]
ImageSelection(images).mainloop()
if __name__ == "__main__":
main()
```

### 2.2.2\. ScrolledText(滾動文本框)
```
#Copying selected text from one text area to another.
from Tkinter import *
import Pmw
class CopyTextWindow( Frame ):
"""Demonatrate ScrolledText"""
def __init__( self ):
"""Create two ScrolledText and a Button"""
Frame.__init__( self )
Pmw.initialise()
self.pack( expand = YES, fill = BOTH )
self.master.title( "ScrolledText Demo" )
#create scrolled text box with word wrap enable
self.text1 = Pmw.ScrolledText( self, text_width = 25, text_height = 12,
text_wrap = WORD, hscrollmode = "static",
vscrollmode = "static" )
self.text1.pack( side = LEFT, expand = YES, fill = BOTH, padx = 5, pady = 5 )
self.copyButton = Button( self, text = "Copy >>>", command = self.copyText )
self.copyButton.pack( side = LEFT, padx = 5, pady = 5 )
#create uneditable scrolled text box
self.text2 = Pmw.ScrolledText( self, text_state = DISABLED, text_width = 25,
text_height = 12, text_wrap = WORD,
hscrollmode = "static", vscrollmode = "static" )
self.text2.pack( side = LEFT, expand = YES, fill = BOTH, padx = 5, pady = 5 )
def copyText( self ):
"""set the text in the second ScrolledText"""
self.text2.settext( self.text1.get( SEL_FIRST,SEL_LAST ) )
def main():
CopyTextWindow().mainloop()
if __name__ == "__main__":
main()
```

## Chapter 3\. PyXML
PyXML是一套用Python解析和處理XML文檔的工具包,包中的4DOM是完全相容于W3C DOM規范的。它包含以下內容:
* xmlproc: 一個符合規范的XML解析器。
* Expat: 一個快速的,非驗證的XML解析器。
* sgmlop: a C helper module that can speed-up xmllib.py and sgmllib.py by a factor of 5.
* PySAX: SAX 1 and SAX2 libraries with drivers for most of the parsers.
* 4DOM: A fully compliant DOM Level 2 implementation
* javadom: An adapter from Java DOM implementations to the standard Python DOM binding.
* pulldom: a DOM implementation that supports lazy instantiation of nodes.
* marshal: a module with several options for serializing Python objects to XML, including WDDX and XML-RPC.
## 3.1\. 安裝
到[http://sourceforge.net/project/showfiles.php group_id=6473](http://sourceforge.net/project/showfiles.php group_id=6473)下載最新版的模塊,現在是PyXML-0.8.3。安裝PyXML需要有python2.0以上及以上的版本。下載完成后用tar解壓縮生成PyXML-0.8.3目錄,進入該目錄并運行python setup.py build和python setup.py install完成安裝。測試方法是進入命令行交互界面運行“import xml.dom.ext"命令,如果沒提示模塊出錯則說明安裝成功。PyXML提供windows平臺的安裝包,下載后雙擊運行就可以了。
## 3.2\. 使用
由于該模塊的內容較多,所以該模塊的詳細使用將我在“PyXML學習筆記”中單獨討論。
## Chapter 4\. PyGame
PyGame是一組用于多媒體開發和游戲軟件開發的模塊。
## Chapter 5\. PyOpenGL
PyOpenGL模塊封裝了“OpenGL應用程序編程接口”,通過該模塊python程序員可在程序中集成2D和3D的圖形。
## Chapter 6\. NumPy和Numarray
NumPy是Python的一個擴展庫,主要用于處理任意維數的固定類型數組,它的低層代碼使用C來編寫,所以速度的優勢很明顯。Numarray是NumPy的一個改進版,用于取代NumPy。
## Chapter 7\. MySQLdb
MySQLdb模塊用于連接MySQL數據庫。源碼位于[http://sourceforge.net/projects/mysql-python](http://sourceforge.net/projects/mysql-python),這里還有用于zope的ZMySQLDA模塊,通過它就可在zope中連接mysql數據庫。
## 7.1\. 安裝
安裝的方法在解壓目錄的README文件中有詳細說明。不難,這里就不詳細講了。要注意的一點是,如果你的mysql不是安裝在默認的路徑,而是安裝在/usr/local/mysql這樣的路徑的話,libmysqlclient.so.12這個動態庫python可能會找不到,造成import出錯,解決方法是在/usr/lib下做一個符號連接,ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.12 libmysqlclient.so.12。最后在python中用import MySQLdb測試,如果沒有出錯信息就說明安裝成功,可以連接mysql數據庫了。
## 7.2\. 模塊功能
* connect()方法用于連接數據庫,返回一個數據庫連接對象。如果要連接一個位于host.remote.com服務器上名為fourm的MySQL數據庫,連接串可以這樣寫:
```
db = MySQLdb.connect(host="remote.com",user="user",passwd="xxx",db="fourm" )
```
connect()的參數列表如下:
* host,連接的數據庫服務器主機名,默認為本地主機(localhost)。
* user,連接數據庫的用戶名,默認為當前用戶。
* passwd,連接密碼,沒有默認值。
* db,連接的數據庫名,沒有默認值。
* conv,將文字映射到Python類型的字典。默認為MySQLdb.converters.conversions
* cursorclass,cursor()使用的種類,默認值為MySQLdb.cursors.Cursor。
* compress,啟用協議壓縮功能。
* named_pipe,在windows中,與一個命名管道相連接。
* init_command,一旦連接建立,就為數據庫服務器指定一條語句來運行。
* read_default_file,使用指定的MySQL配置文件。
* read_default_group,讀取的默認組。
* unix_socket,在unix中,連接使用的套接字,默認使用TCP。
* port,指定數據庫服務器的連接端口,默認是3306。
* 連接對象的db.close()方法可關閉數據庫連接,并釋放相關資源。
* 連接對象的db.cursor([cursorClass])方法返回一個指針對象,用于訪問和操作數據庫中的數據。
* 連接對象的db.begin()方法用于開始一個事務,如果數據庫的AUTOCOMMIT已經開啟就關閉它,直到事務調用commit()和rollback()結束。
* 連接對象的db.commit()和db.rollback()方法分別表示事務提交和回退。
* 指針對象的cursor.close()方法關閉指針并釋放相關資源。
* 指針對象的cursor.execute(query[,parameters])方法執行數據庫查詢。
* 指針對象的cursor.fetchall()可取出指針結果集中的所有行,返回的結果集一個元組(tuples)。
* 指針對象的cursor.fetchmany([size=cursor.arraysize])從查詢結果集中取出多行,我們可利用可選的參數指定取出的行數。
* 指針對象的cursor.fetchone()從查詢結果集中返回下一行。
* 指針對象的cursor.arraysize屬性指定由cursor.fetchmany()方法返回行的數目,影響fetchall()的性能,默認值為1。
* 指針對象的cursor.rowcount屬性指出上次查詢或更新所發生行數。-1表示還沒開始查詢或沒有查詢到數據。
## 7.3\. 模塊功能演示
```
#!/usr/bin/python
import MySQLdb
try:
connection = MySQLdb.connect(user="user",passwd="password",host="xxx",db="test")
except:
print "Could not connect to MySQL server."
exit( 0 )
try:
cursor = connection.cursor()
cursor.execute( "SELECT note_id,note_detail FROM note where note_id = 1" )
print "Rows selected:", cursor.rowcount
for row in cursor.fetchall():
print "note : ", row[0], row[1]
cursor.close()
```
## Chapter 8\. Tkinter模塊
## 8.1\. Tkinter簡介
Tkinter是Python默認的圖形界面接口,Tkinter是一個和Tk接口的Python模塊,Tkinter庫提供了對Tk API的接口,它屬于Tcl/Tk的GUI工具組。Tcl/Tk是由John Ousterhout發展的書寫和圖形設備。Tcl(工具命令語言)是個宏語言,用于簡化shell下復雜程序的開發,Tk工具包是和Tcl一起開發的,目的是為了簡化用戶接口的設計過程。Tk工具包由許多不同的小部件,如一個按鈕、一個滾動條等。通過Tk提供的這些小部件,我們就可快速地進行GUI開發。Perl、Scheme等語言也利用Tk庫進行GUI開發。Tkinter是跨平臺,在各種平臺下都能使用。
## Chapter 9\. PyGTK
PyGTK是一個用于python GUI程序開發的GTK+庫,當前版本的PyGTK需要GTK+ 2.0以上版本支持和Python 2.2以上版本支持才能運行。
## 9.1\. 安裝
如果是在Debian系統中,則安裝python2.3-gtk2軟件包即可。如果要從源碼安裝,可到[http://www.pygtk.org](http://www.pygtk.org)下載最新的軟件包。安裝方法也很簡單,和其它開源軟件差不多,通過configure、make和make install三步操作就可完成。具體操作你可參考源碼目錄下的README和INSTALL文檔,里面有詳細的安裝說明。注意,要成功安裝PyGTK,要有相應版本的GTK+和Python支持。在源碼目錄下有一個examples目錄,這是一個寶貴的資源,里面有很多有用的PyGTK示例代碼,對我們學習PyGTK很有幫助。
## 9.2\. 示例
下面是一個PyGTK的示例,演示了PyGTK的基本概念。
```
#!/usr/bin/env python
#-*- encoding:utf-8 -*-
import pygtk
pygtk.require('2.0')
import gtk
class base:
#destroy信號的回調函數
def destroy(self,widget,data=None):
gtk.main_quit()
#clicked信號的回調函數
def hello(self,widget,data):
print 'hello ' + data + ' this is a button clicked() test'
#delete_event事件的回調函數
def delete_event(self, widget, event, data=None):
print "delete event occurred"
#如果delete_event事件返回假,則會觸發destroy信號,從而關閉窗口。
#如果返回真,則不會關閉窗口。這個特性在當我們需要一個確認是否退出的選擇對話框時是很有用。
return gtk.FALSE
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
#設置窗口的delete_event信號觸發delete_event函數
self.window.connect("delete_event", self.delete_event)
#設置窗口的destroy信號觸發destroy函數
handler1 = self.window.connect("destroy",self.destroy)
print "handler1 is:%d" % handler1
self.window.set_title('PyGTK 測試 window')
self.window.set_default_size(200,200)
self.window.set_border_width(100)
#控制窗口出現的位置
self.window.set_position(gtk.WIN_POS_CENTER)
#生成按鈕實例
self.button1 = gtk.Button()
self.button2 = gtk.Button()
self.button1.set_label('label1')
self.button2.set_label('label2')
#設置按鈕的clicked信號觸發hello函數,并傳遞‘pyGTK’字符串參數給hello函數
handler2 = self.button1.connect("clicked",self.hello,"pyGTK")
print "handler2 is:%d" % handler2
#設置按鈕的clicked信號觸發self..window對象的gtk.Widget.destroy方法
self.button1.connect_object("clicked", gtk.Widget.destroy, self.window)
#取消handler2的功能
# self.button.disconnect(handler2)
#設置一個不可見的橫向的欄位self.box1
self.box1 = gtk.HBox(gtk.FALSE, 0)
#把box1放到窗口中
self.window.add(self.box1)
#把button1部件放到box1中
self.box1.pack_start(self.button1,gtk.TRUE,gtk.TRUE,0)
self.button1.show()
#把button2部件放到button1部件之后
self.box1.pack_start(self.button2,gtk.TRUE,gtk.TRUE,0)
self.button2.show()
self.box1.show()
self.window.show()
def main(self):
gtk.main()
print __name__
if __name__ == "__main__":
base = base()
base.main()
```
有關PyGTK的詳細介紹請參考我整理的“PyGTK學習筆記”。
## Chapter 10\. PyQt
PyQt是一套用于python的Qt開發庫,由一系列的模塊組成,有qt, qtcanvas, qtgl, qtnetwork, qtsql, qttable, qtui and qtxml,包含有300個類和超過5750個的函數和方法。
PyQt還支持一個叫qtext的模塊,它包含一個QScintilla庫。該庫是Scintillar編輯器類的Qt接口。
## 10.1\. 安裝
到[http://www.riverbankcomputing.co.uk/pyqt/download.php](http://www.riverbankcomputing.co.uk/pyqt/download.php)下載最新的版本。安裝PyQt需要先安裝SIP,到以[這里](http://www.riverbankcomputing.co.uk/sip/download.php)下載。[SIP](http://www.riverbankcomputing.co.uk/sip/index.php)是一個把C\C++庫轉換成Python模塊的工具。
* 安裝SIP
```
% tar -zxvf sip-4.1.1.tar.gz
% cd sip-4.1.1
% python configure.py -l qt # -l qt 選項指定qt版本
% make
% make install
```
* 安裝PyQt
```
% tar -zxvf PyQt-x11-gpl-3.13.tar.gz
% cd PyQt-x11-gpl-3.13
% python configure.py
% make
% make install
```
## Chapter 11\. PyMedia
PyMedia模塊是一個用于多媒體操作的python模塊。它提供了豐富而簡單的接口用于多媒體處理(wav, mp3, ogg, avi, divx, dvd, cdda etc)。可在Windows和Linux平臺下使用。
## Chapter 12\. Python-ldap
Python-ldap模塊提供一組面向對象的API,可方便地在python中訪問ldap目錄服務,它基于OpenLDAP2.x。
## 12.1\. 示例
* 以下示例在python-ldap網站上有列出,這里作一下簡要說明:
```
#!/usr/bin/python
#-*- coding:utf-8 -*- #設置源碼文件編碼為utf-8
import ldap
try:
conn = ldap.open("server_name") #server_name為ldap服務器名
conn.protocol_version = ldap.VERSION3 #設置ldap協議版本
username = "cn=admin,dc=company,dc=com" #用戶名
password = "123" #訪問密碼
conn.simple_bind(username,password) #連接
except ldap.LDAPError, e: #捕獲出錯信息
print e
baseDN = "dc=employees,dc=company,dc=com" #設置目錄的搜索路徑起點
searchScope = ldap.SCOPE_SUBTREE #設置可搜索子路徑
retrieveAttributes = None #None表示搜索所有屬性,['cn']表示只搜索cn屬性
searchFilter = "cn=test" #設置過濾屬性,這里只顯示cn=test的信息
try:
ldap_result_id = conn.search(baseDN,searchScope,searchFilter,retrieveAttributes)
#調用search方法返回結果id
result_set = []
while 1:
result_type, result_data = conn.result(ldap_result_id, 0) #通過結果id返回信息
if result_data == []:
break
else:
if result_type == ldap.RES_SEARCH_ENTRY:
result_set.append(result_data)
print result_set[0][0][1]['o'][0] #result_set是一個復合列表,需通過索引返回組織單元(o)信息
except ldap.LDAPError, e:
print e
```
這里采用的是非同步方式,同步方式的連接和搜索命令后有“_s”后綴,如search_s。非同步方式需通過一個結果id來訪問目錄服務信息。
* 下面是一個修改目錄信息的示例:
```
#!/usr/bin/python
# -*- coding:utf-8 -*-
import ldap
try:
conn = ldap.open("server_name")
conn.protocol_version = ldap.VERSION3
username = "cn=admin,dc=company,dc=com"
password = "123"
conn.simple_bind_s(username,password)
except ldap.LDAPError, e:
print e
try:
dn = "cn=test,dc=employees,dc=company,dc=com"
conn.modify_s(dn,[(ldap.MOD_ADD,'mail','test@163.com')]) #增加一個mail屬性
except ldap.LDAPError, e:
print e
```
ldap.MOD_ADD表示增加屬性,ldap.MOD_DELETE表示刪除屬性,ldap.MOD_REPLACE表示修改屬性。
* 下面是一個增加目錄項的示例:
```
#!/usr/bin/python
# -*- coding:utf-8 -*-
import ldap,ldap.modlist #ldap.modlist是ldap的子模塊,用于格式化目錄服務的數據項
try:
conn = ldap.open("server_name")
conn.protocol_version = ldap.VERSION3
username = "cn=admin,dc=company,dc=com"
password = "123"
conn.simple_bind_s(username,password)
except ldap.LDAPError, e:
print e
try:
dn = "cn=test,dc=card,dc=company,dc=com"
modlist = ldap.modlist.addModlist({ #格式化目錄項,除對象類型要求必填項外,
'cn': ['test'], #其它項可自由增減
'objectClass': ['top', 'person', 'organizationalPerson', 'inetOrgPerson'],
'o': ['\xe5\xb9\xbf\xe5\xb7\x9e'], #這些為utf-8編碼的中文
'street': ['\xe5\xb9\xbf\xe5\xb7\x9e'],
'sn': ['tester'],
'mail': ['test@163.com', 'test@21cn.com'],
'homePhone': ['xxxxxxxx'], 'uid': ['test'] })
# print modlist #顯示格式化數據項,格式化后是一個元組列表
conn.add_s(dn,modlist) #調用add_s方法添加目錄項
except ldap.LDAPError, e:
print e
```
其實我們也可按格式化后元組列表的形式把目錄項直接寫到add_s()里,省卻轉換的步驟。
* 下面是一個刪除目錄項的示例:
```
#!/usr/bin/python
# -*- coding:utf-8 -*-
import ldap
try:
conn = ldap.open("server_name")
conn.protocol_version = ldap.VERSION3
username = "cn=admin,dc=company,dc=com"
password = "123"
conn.simple_bind_s(username,password)
except ldap.LDAPError, e:
print e
try:
dn = "cn=sale,dc=company,dc=com"
conn.delete_s(dn)
except ldap.LDAPError, e:
print e
```
## Chapter 13\. ftplib -- FTP protocol client
ftplib模塊定義了FTP類和一些方法,用以進行客戶端的ftp編程。我們可用python編寫一個自已的ftp客戶端程序,用于下載文件或鏡像站點。如果想了解ftp協議的詳細內容,請參考[RFC959](http://www.faqs.org/rfcs/rfc959.html)。
## 13.1\. 示例
該模塊是python的通用模塊,所以默認應該已安裝。ftplib模塊使用很簡單,暫時只有一個FTP類和十幾個函數。下面用一個交互方式演示一下ftplib的主要功能。
```
>>> from ftplib import FTP
>>> ftp=FTP('ftp.python.org')
>>> ftp.login()
'230 Login successful.'
>>> ftp.dir()
drwxrwxr-x 7 1004 1004 512 Aug 13 01:35 pub
>>> ftp.cwd('pub')
'250 Directory successfully changed.'
>>> ftp.dir()
drwxrwxr-x 5 1000 1004 1024 Dec 24 11:04 docs.python.org
drwxrwsr-x 2 1002 1004 512 Oct 12 2001 jython
lrwx------ 1 0 1003 25 Aug 03 2001 python -> www.python.org/ftp/python
drwxr-xr-x 9 1018 1004 512 Feb 02 03:44 pyvault
drwxr-xr-x 2 1005 1004 512 May 06 2003 tmp
drwxrwsr-x 59 1004 1004 3072 Feb 03 14:58 www.python.org
>>> ftp.quit()
'221 Goodbye.'
```
下面一個下載文件的示例
```
#!/usr/bin/env python
#author:Jims of www.ringkee.com
#create date: 2005/02/05
#description: Using ftplib module download a file from a ftp server.
from ftplib import FTP
ftp=FTP()
ftp.set_debuglevel(2) #打開調試級別2,顯示詳細信息
ftp.connect('ftp_server','port') #連接
ftp.login('username','password') #登錄,如果匿名登錄則用空串代替即可
print ftp.getwelcome() #顯示ftp服務器歡迎信息
ftp.cwd('xxx/xxx/') #選擇操作目錄
bufsize = 1024 #設置緩沖塊大小
filename='dog.jpg'
file_handler = open(filename,'wb').write #以寫模式在本地打開文件
ftp.retrbinary('RETR dog.jpg',file_handler,bufsize) #接收服務器上文件并寫入本地文件
ftp.set_debuglevel(0) #關閉調試
ftp.quit() #退出ftp服務器
```
下面一個上傳文件的示例,要成功運行該腳本,需在ftp服務器上有上傳文件的權限。
```
#!/usr/bin/env python
#author:Jims of www.ringkee.com
#create date: 2005/02/05
#description: Using ftplib module upload a file to a ftp server.
from ftplib import FTP
ftp=FTP()
ftp.set_debuglevel(2)
ftp.connect('ftp_server','port')
ftp.login('username','password')
print ftp.getwelcome()
ftp.cwd('xxx/xxx/')
bufsize = 1024
filename='dog.jpg'
file_handler = open(filename,'rb')
ftp.storbinary('STOR dog.jpg',file_handler,bufsize) #上傳文件
ftp.set_debuglevel(0)
file_handler.close() #關閉文件
ftp.quit()
```
是不是很簡單,其它功能可查詢python的官方網站,網址是[http://docs.python.org/lib/module-ftplib.html](http://docs.python.org/lib/module-ftplib.html)。
## Chapter 14\. Psyco
Psyco是一個Python代碼加速度器,可使Python代碼的執行速度提高到與編譯語言一樣的水平。
## 14.1\. 安裝
安裝Psyco很簡單,它有兩種安裝方式,一種是源碼方式,一種是二進制碼方式:
* 如果用源碼方式安裝,你需在源碼的目錄中調用python setup.py install命令編譯生成psyco子目錄,再把該子目錄整個拷貝到python的site-packages目錄下。
* 如果用二進制碼方式安裝,按[這個網址](http://psyco.sourceforge.net/psycoguide/binaries.html)列表中的python與psyco版本對應表下載合適的二進制文件,解壓后會生成一個psyco-1.x的目錄,把該目錄下的psyco目錄整個拷貝到python的site-packages目錄下即可。
## Chapter 15\. smtplib
## 15.1\. 示例
smtplib模塊以發送電子郵件。下面是一個示例,可發送附件。
```
#!/usr/bin/python
#-*- encoding:utf-8 -*-
import smtplib,mimetypes
from email import Encoders
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
msg = MIMEMultipart() #創建可包含附件的MIME對象
msg['Subject'] = 'this is title'
msg['From'] = 'yjnet@21cn.com'
msg['To'] = 'yjnet@21cn.com'
txt = MIMEText('這是郵件正文的中文測試。',_charset='utf-8')
msg.attach(txt)
filename = 'jdk15.tar' #附件名
fp = open(filename,'rb')
ctype,encoding = mimetypes.guess_type(filename)
if ctype is None or encoding is not None:
ctype = 'application/octet-stream'
maintype,subtype = ctype.split('/',1)
m = MIMEBase(maintype,subtype)
m.set_payload(fp.read())
fp.close()
Encoders.encode_base64(m) #把附件編碼
m.add_header('Content-disposition','attachment',filename=filename) #修改郵件頭
msg.attach(m) #添加附件
s = smtplib.SMTP('smtp.21cn.com') #連接郵件服務器
s.login('yjnet','****') #登錄郵件服務器
s.sendmail('yjnet@21cn.com','yjnet@21cn.com',msg.as_string()) #發送郵件
s.close()
```
## Chapter 16\. XMPPPY
Jabber服務器采用開發的XMPP協議,Google Talk也是采用XMPP協議的IM系統 。在Python中有一個xmpppy模塊支持該協議。也就是說,我們可以通過該模塊與Jabber服務器通信,是不是很Cool。
## 16.1\. 示例
下面是一個簡單的示例,可使大家對該模塊有一個大概的了解。
```
#導入xmpppy模塊
>>> import xmpp
#建立Client實例,debian是我的jabber服務器名,jabber服務器的安裝可參考我的Debian學習筆記。
>>> c=xmpp.Client('debian',debug=[])
#連接
>>> c.connect()
'tcp'
#驗證
>>> c.auth('yangjing','12345')
'old_auth'
#登入
>>> c.sendInitPresence()
#向ringkee@debian
>>> c.send(xmpp.protocol.Message('ringkee@debian ','test message from yangjing'))
'20'
#下面測試信息接收功能,如果沒有信息,則pending_data()為空
>>>c.TCPsocket.pending_data()
[]
#如果有信息,則pending_data()不為空
>>> c.TCPsocket.pending_data()
[<socket._socketobject object at 0xb795beb4>]
#接收信息
>>> c.TCPsocket.receive()
"<message type='chat' to='yangjing@debian/xmpppy' from='ringkee@debian/Gaim'><x xmlns='jabber:x:event'><composing/></x><body>message from ringkee@debian</body><html xmlns='http://jabber.org/protocol/xhtml-im'><body xmlns='http://www.w3.org/1999/xhtml'>message from <a HREF='mailto:ringkee@debian'>ringkee@debian</a></body></html></message>"
#登出
>>> c.disconnect()
```
## 16.2\. cjkcodecs
在python2.4版以前,python不能處理cjk(中國,日本和韓國)的編碼,所以就有了cjkcodecs模塊。安裝該模塊后Python就能處理cjk字符了。下載網址:[http://cjkpython.i18n.org/](http://cjkpython.i18n.org/)。