<h1>Python 开源库及示例代码</h1>

= =

= 说明 =

本页面汇总俺收集的各种 Python 代码库，不定期更新。

本页面列出的各种 Python 库/模块，如果注明了官网的网址，说明这个库是第三方的；否则就是 Python 语言内置的标准库。

如果你发现本页面的开源库有错漏之处，非常欢迎给俺提供反馈——有 GitHub 帐号的同学，可以[https://github.com/programthink/opensource/issues 给俺发 issue]；没帐号的同学，可以去[https://program-think.blogspot.com/ 俺博客]留言。

----

= 1 算法 =

== 1.1 字符串 ==

=== 1.1.1 正则表达式 ===

<h4>re</h4>

【标准库】

提供基于正则的匹配和替换。

=== 1.1.2 字符集 ===

<h4>chardet</h4>

Home：[https://github.com/erikrose/chardet]

chardet 可以猜测任意一段文本的字符集编码。对于编码类型未知的文本，它会很有用。

chardet 既可以作为模块来使用，也可以作为命令行工具来使用。

代码示例
<source lang="python">
import chardet
print(chardet.detect(bytes))
</source>

=== 1.1.3 （其它） ===

<h4>StringIO & cStringIO</h4>

【标准库】

以读写文件的方式来操作字符串（有点类似于内存文件）。

cStringIO 是 C 语言实现的，性能更高；而 StringIO 是 Python 实现的，提供 Unicode 兼容性。

<h4>difflib</h4>

【标准库】

可以对两个字符串进行“按行”比较，其功能类似于命令行的 diff。

另外还支持“最佳匹配”功能——对给定的字符串 s 和字符串列表 l，在 l 里面找到最接近 s 的字符串。

== 1.2 编码 & 解码 ==

=== 1.2.1 base64 ===

[https://en.wikipedia.org/wiki/Base64 Base64] 是一组编码算法的总称。用于把二进制数据编码为文本。

<h4>base64</h4>

【标准库】

提供 Base16、Base32、Base64 格式的编码和解码。

=== 1.2.2 UUencode ===

[https://en.wikipedia.org/wiki/Uuencode UUencode] 出现于早期的 Unix 系统。用于把二进制编码为文本，以便通过邮件系统发送。

<h4>uu</h4>

【标准库】

提供 UUencode 格式的编码和解码。

=== 1.2.3 BinHex ===

[https://en.wikipedia.org/wiki/BinHex BinHex] 起先用于 Mac OS 系统，类似于 UUencode。

<h4>binhex</h4>

【标准库】

提供 BinHex 格式的编码和解码。

== 1.3 数学类 ==

<h4>math</h4>

【标准库】

顾名思义，这个标准库封装了常用的数学函数（开方、指数、对数、三角函数......）。

<h4>random</h4>

【标准库】

顾名思义，这个标准库是用来进行随机数生成滴。

代码示例——生成 0-100 的随机数
<source lang="python">
import random
random.seed()
random.randint(0, 100)
</source>

<h4>fractions</h4>

【标准库】

封装了跟有理数（分数）相关的运算

== 1.4 容器 ==

<h4>pygtrie</h4>

Home：[https://github.com/google/pytrie]

这是 Google 实现的 [https://zh.wikipedia.org/wiki/Trie trie]（前缀树/字典树）封装库。

----

= 2 跨语言编程 =

Python 可以很容易地跟其它编程语言整合。整合之后，就可以在 Python 代码中使用其它编程语言的函数、模块、库，非常爽！
== 2.1 整合 C & C++ ==

<h4>ctypes</h4>

ctypes 在 Python 2.5 版本加入到标准库中。

通过它，你可以很方便地调用 C/C++ 动态库导出的函数，可以在 Python 中使用各种 C/C++ 的数据类型（包括“指针”和“引用”）。

代码示例——调用 Linux/Unix 系统的标准 C 函数，获取当前时间
<source lang="python">
from ctypes import *

libc = CDLL("libc.so.6")
time = libc.time(None)
</source>

代码示例——调用 Windows 系统的 API，弹出消息提示框
<source lang="python">
from ctypes import c_int, WINFUNCTYPE, windll
from ctypes.wintypes import HWND, LPCSTR, UINT

prototype = WINFUNCTYPE(c_int, HWND, LPCSTR, LPCSTR, UINT)
paramflags = (1, "hwnd", 0), (1, "text", "Hi"), (1, "caption", None), (1, "flags", 0)
MessageBox = prototype(("MessageBoxA", windll.user32), paramflags)
MessageBox(text="Hello, world", flags=2)
</source>

<h4>SWIG（Simplified Wrapper and Interface Generator）</h4>

Home：[http://swig.org/]

Links：[https://en.wikipedia.org/wiki/SWIG Wikipedia]

这是一个很老牌的、有名气的工具，它可以把多种语言（Java、Python、C#、Ruby、PHP、Perl、Lua、Go ...）整合到 C/C++ 中。

<h4>Cython</h4>

Home：[http://cython.org/]

这个工具可以让你用 Python 的语法写扩展模块的代码，然后它帮你把 Python 代码编译为本地动态库（机器码）。

用它编译出来的扩展模块，其性能跟 C/C++ 编写的扩展模块相当。

== 2.2 整合 JVM 平台 ==

<h4>Jython</h4>

Home：[http://www.jython.org/]

Links：[https://en.wikipedia.org/wiki/Jython Wikipedia] [https://zh.wikipedia.org/wiki/Jython 维基百科]

通过 Jython 可以让 Python 代码运行在 JVM 上，并且可以调用其它的 JVM 语言的代码（比如 Java、Scala）

== 2.3 整合 dotNet 平台 ==

<h4>IronPython</h4>

Home：[http://ironpython.net/]

Links：[https://en.wikipedia.org/wiki/IronPython Wikipedia] [https://zh.wikipedia.org/wiki/IronPython 维基百科]

通过 IronPython 可以让 Python 代码运行在 dotNET 平台上，并且可以调用其它的 dotNET 语言的代码（C#、F#、VB.Net ...）

== 2.4 整合 Go ==

<h4>gopy</h4>

Home：[https://github.com/go-python/gopy]

gopy 可以把 Go 源代码编译为 Python 的一个 module。

它提供了两种方式（命令行、Python 库）来实现：Go 源码编译为 Python 模块。

== 2.5 整合 Objective-C ==

<h4>PyObjC</h4>

Home：[http://pyobjc.sourceforge.net/]

这是用 Python 封装 Mac OS X 上的 Objective-C 库。

----

= 3 操作系统 =

== 3.1 文件和目录操作 ==

<h4>os</h4>

【标准库】

这是非常基本的标准库，提供了常见的操作系统相关功能，很多功能是针对文件系统。

<h4>shutil</h4>

【标准库】

相对于 os 而言，shutil 提供了一些比较高级的文件和目录操作（目录递归复制、目录递归删除、目录压缩打包...）

代码示例——递归删除某个目录
<source lang="python">
import shutil
shutil.rmtree(xxxx)
</source>

<h4>glob</h4>

【标准库】

用于查找文件，【支持通配符】（* 和 ?）

代码示例——获取当前目录所有 txt 文件
<source lang="python">
import glob
for file in glob.glob("./*.txt") :
    print(file)
</source>

<h4>fnmatch</h4>

【标准库】

用于匹配文件名（支持通配符，类似上面的 glob）

代码示例——列出当前目录所有 txt 文件
<source lang="python">
import os, fnmatch

for file in os.listdir(".") :
    if fnmatch.fnmatch(file, "*.txt") :
        print(file)
</source>

<h4>tempfile</h4>

【标准库】

使用它可以安全地生成临时文件或临时目录。

    

== 3.2 线程 ==

<h4>threading</h4>

【标准库】

提供了比较高层的线程封装 API。它本身包含了线程同步/互斥的机制。

代码示例——基于“函数”的线程
<source lang="python">
import threading
import time

def my_thread() :
    print("Thread started!")
    time.sleep(3)
    print("Thread finished!")

threading.Thread(target=my_thread).start()
</source>

代码示例——基于“类”的线程
<source lang="python">
import threading
import time
from &#95;&#95;future&#95;&#95; import print_function

class MyThread(threading.Thread) :
    def run(self) :
        print("{} started!".format(self.getName()))
        time.sleep(3)
        print("{} finished!".format(self.getName()))

if &#95;&#95;name&#95;&#95; == "&#95;&#95;main&#95;&#95;" :
    for n in range(10) :
        mythread = MyThread(name = "Thread-{}".format(n + 1))
        mythread.start()
        time.sleep(1)
</source>

== 3.3 进程 ==

<h4>subprocess</h4>

【标准库】

用于进程管理，可以启动子进程，通过标准输入输出跟子进程交互。

代码示例——启动命令行进程，并获取该进程的标准输出
<source lang="python">
import subprocess
output = subprocess.check_output(["dir"])  # 获取当前目录的内容
output = subprocess.check_output(["netstat", "-an"])  # 获取当前网络链接
</source>

<h4>multiprocessing</h4>

【标准库】

它是 2.6 版本加入到标准库的，其 API 接口的风格类似于 threading 模块。

它本身包含了进程同步/互斥的机制。

代码示例——利用其 Lock 机制，确保多个子进程的标准输出不会混杂（每次只有一个进程调用 print）。
<source lang="python">
from multiprocessing import Process, Lock

def f(lock, n) :
    lock.acquire()
    print("hello world %d" % n)
    lock.release()

if &#95;&#95;name&#95;&#95; == "&#95;&#95;main&#95;&#95;" :
    lock = Lock()
    for num in range(10):
        Process(target=f, args=(lock, num)).start()
</source>

<h4>sh</h4>

Home：[https://github.com/amoffat/sh]

这个项目可以用来取代标准库中的 subprocess；同时兼容 Python2 和 Python3。

使用它可以写出比 subprocess 更简洁、更优雅的代码。

代码示例——获取命令输出
<source lang="python">
from sh import ifconfig
print(ifconfig("wlan0"))
</source>

代码示例——命令行参数
<source lang="python">
from sh import curl
&#35; 传统风格
curl("https://program-think.blogspot.com/", "-o", "test.html", "--silent")
&#35; 命名参数风格
curl("https://program-think.blogspot.com/", o="test.html", silent=True)
</source>

代码示例——管道
<source lang="python">
from sh import ls, wc
print(wc(ls("/etc", "-1"), "-l"))
</source>

== 3.4 本地进程间通信（IPC） ==

<h4>mmap</h4>

【标准库】

提供了内存映射文件的支持。

代码示例——利用 mmap 在父子进程间交换数据
<source lang="python">
import os
import mmap

map = mmap.mmap(-1, 13)
map.write("Hello, world")

pid = os.fork()
if pid == 0 :  # 子进程
    map.seek(0)
    print(map.readline())
    map.close()
</source>

<h4>signal</h4>

【标准库】

用于进程信号处理的标准库（主要用于 Linux & UNIX 系统）。

== 3.5 操作硬件 ==

<h4>keyboard</h4>

Home：[https://github.com/boppreh/keyboard]

顾名思义，这个库让你可以进行各种键盘相关的操作，包括：模拟按键、键盘钩子（hook），按键记录及重放。

支持复杂的组合键。纯 python 代码代码，同时支持 Windows 和 Linux。

代码示例
<source lang="python">
import keyboard

&#35; 模拟按键。
keyboard.press_and_release("shift+s, space")

&#35; 模拟按键，并执行相应代码。
keyboard.add_hotkey("page up, page down", lambda: keyboard.write("xxxx"))

&#35; 等待特定按键，然后继续执行。
keyboard.wait("esc")

&#35; 记录按键，直到用户按了 ESC；然后以3倍速重放刚才记录的按键。
recorded = keyboard.record(until="esc")
keyboard.play(recorded, speed_factor=3)
</source>

== 3.6 获取系统信息 ==

<h4>sys</h4>

【标准库】

这个模块可供访问由解释器使用或维护的变量和与解释器进行交互的函数。

代码示例
<source lang="python">
sys.argv     # 命令行参数 List，第一个元素是程序本身路径
sys.exit(0)  # 退出程序，正常退出时用 0 表示退出码
sys.version  # 获取 Python 解释程序的版本信息
</source>

<h4>platform</h4>

【标准库】

这个模块提供了很多用于获取操作系统的信息的功能。

代码示例
<source lang="python">
import platform

platform.platform()      # 获取操作系统名称及版本号，例如："Windows-7-6.1.7601-SP1"
platform.version()       # 获取操作系统版本号，例如："6.1.7601"
platform.architecture()  # 获取操作系统的架构，例如：("32bit", "WindowsPE")
</source>

<h4>psutil</h4>

Home：[https://github.com/giampaolo/psutil]

psutil（Python system and process utilities）是一个跨平台的进程管理和系统工具库，可以处理”CPU、内存、磁盘、网络、用户“等信息。

主要用于系统资源的监控，分析，以及对进程进行一定的管理。

代码示例
<source lang="python">
import psutil

psutil.cpu_count()       # 获取 CPU 数量
psutil.cpu_freq()        # 获取 CPU 频率

psutil.virtual_memory()  # 获取内存信息
psutil.swap_memory()     # 获取交换分区（换页文件）信息

psutil.disk_partitions() # 获取分区信息
psutil.disk_usage('/')   # 获取某分区的使用情况

psutil.users()           # 获取用户信息

p = psutil.Process(pid)  # 根据给定的 pid 获得进程对象
p.name()                 # 进程名
p.exe()                  # 可执行程序的全路径
p.cwd()                  # 进程的当前目录
p.cmdline()              # 启动进程的命令行参数
</source>

== 3.7 Linux & Unix 系统相关 ==

<h4>syslog</h4>

【标准库】

通过它可以很方便地跟 POSIX 的 syslog 服务进行交互。

== 3.8 Windows 系统相关 ==

<h4>PyWin32</h4>

Home：[http://python.net/crew/mhammond/win32/]

这个第三方库封装了 Windows API 及 COM API。通过它可以方便地用 Python 进行 Windows 编程（调用 COM 组件、编写 Windows 服务、等）。

== 3.9 程序打包 ==

<h4>PyInstaller</h4>

Home：[http://www.pyinstaller.org/]

PyInstaller 可以把你的 Python 代码制作成独立运行的程序（不依赖 Python 环境就可以运行）。

该工具支持多种操作系统，包括：Windows、Linux、Mac OS X、Solaris、AIX、等。

<h4>py2exe</h4>

Home：[http://www.py2exe.org/]

Links：[https://en.wikipedia.org/wiki/Py2exe Wikipedia]

py2exe 的功能类似 PyInstaller，但只支持 Windows 平台。

<h4>py2app</h4>

Home：[https://bitbucket.org/ronaldoussoren/py2app]

它很类似于 [http://www.py2exe.org/ py2exe]，差别在于 [http://www.py2exe.org/ py2exe] 支持 Windows 平台，而 [https://bitbucket.org/ronaldoussoren/py2app py2app] 支持 Mac OS X 平台。

<h4>EasyInstall & Setuptools</h4>

Home：[https://pypi.python.org/pypi/setuptools]

这套工具可以帮助你进行第三方库的管理（下载、编译、安装、升级、卸载）

----

= 4 Web =

== 4.1 HTTP Client ==

<h4>httplib & httplib2 & http.request & urllib.parse</h4>

【标准库】

这几个库可以进行各种 HTTP 客户端请求（GET、POST、等）。

Python2 的模块名是 httplib 和 httplib2；到 Python3，模块名改为 http.request 和 urllib.parse

代码示例——读取指定 URL 的网页内容
<source lang="python">
import urllib
handle = urllib.urlopen("http://www.google.com")
page = handle.read()
handle.close()
</source>

<h4>Requests</h4>

Home：[http://www.python-requests.org/]

这是一个用起来很优雅的库，如其名，封装了 HTTP 请求的功能。

代码示例
<source lang="python">
>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}
</source>

== 4.2 HTTP Server ==

<h4>SimpleHTTPServer & http.server</h4>

【标准库】

提供轻量级 HTTP Server 的标准库。

Python2 的模块名叫 SimpleHTTPServer；到 Python3 模块名改为 http.server

代码示例——一个极简单的 HTTP 服务
<source lang="python">
import SocketServer
import SimpleHTTPServer

PORT = 8080
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print("serving at port %d" % PORT)
httpd.serve_forever()
</source>

== 4.3 Web 开发框架 ==

（Python 的 Web 框架数不胜数，俺只挑选几个代表性的）
<h4>Django</h4>

Home：[https://www.djangoproject.com/]

Links：[https://en.wikipedia.org/wiki/Django_(web_framework) Wikipedia] [https://zh.wikipedia.org/wiki/Django 维基百科]

在 Python 社区，Django 是目前最有影响力的 Web 开发框架。该框架很重型，内置了 Web 服务端开发常用的组件（比如：ORM、用户管理）。

Django 应用范围很广，比如 Google 的 Web 开发平台 GAE 就支持它。

而且它完全支持前面提到的 Jython 运行环境，可以运行在任何 J2EE 服务器上。

<h4>TurboGears</h4>

Home：[http://www.turbogears.org/]

Links：[https://en.wikipedia.org/wiki/TurboGears Wikipedia] [https://zh.wikipedia.org/wiki/TurboGears 维基百科]

又一个重型的 Web 开发框架，名气仅次于 Django。

它跟 Django 一样，都是“Full-Stack Frameworks”。

<h4>CherryPy</h4>

Home：[http://www.cherrypy.org/]

Links：[https://en.wikipedia.org/wiki/CherryPy Wikipedia]

轻量级的 Web 框架。某些 Web 框架（比如前面提到的 TurboGears）使用它作为底层。

代码示例——Hello world
<source lang="python">
import cherrypy

class HelloWorld(object) :
    def index(self) :
        return "Hello World!"
    index.exposed = True

cherrypy.quickstart(HelloWorld())
</source>

<h4>web.py</h4>

Home：[http://webpy.org/]

与前两个（Django、TurboGears）不同，这是一个轻量级的框架。甚至被称为“It's the anti-framework framework.”

其作者是大名鼎鼎的黑客 [https://en.wikipedia.org/wiki/Aaron_Swartz Aaron Swartz]。（俺在[http://program-think.blogspot.nl/2013/01/weekly-share-37.html 某篇博文]中悼念过他）。

当年 Aaron Swartz 用 web.py 来搭建同样大名鼎鼎的网站 [https://en.wikipedia.org/wiki/Reddit reddit]（该网站是 Web 2.0 的标杆）。

代码示例——Hello world
<source lang="python">
import web

urls = (
    "/", "index"
)

class index :
    def GET(self) :
        return "Hello, world!"

if &#95;&#95;name&#95;&#95; == "&#95;&#95;main&#95;&#95;" :
    app = web.application(urls, globals())
    app.run()
</source>

<h4>Flask</h4>

Home：[http://flask.pocoo.org/]

Links：[https://zh.wikipedia.org/wiki/Flask 维基百科]

轻量级 Web 应用框架。基于 Werkzeug WSGI 工具箱和 Jinja2 模板引擎。

代码示例——Hello world
<source lang="python">
from flask import Flask
app = Flask(&#95;&#95;name&#95;&#95;)

app.route("/")
def hello_world() :
    return “Hello World!"

if &#95;&#95;name&#95;&#95; == "&#95;&#95;main&#95;&#95;" :
    app.run()
</source>

<h4>Tornado</h4>

Home：[http://www.tornadoweb.org/]

Links：[https://zh.wikipedia.org/wiki/Tornado 维基百科]

同样也是轻量级的 Web 框架，类似 Web.py。提供异步非阻塞 IO 的处理方式使其拥有较为出色的抗负载能力。

== 4.4 Web前端 & JS整合 ==

<h4>Pyjamas & pyjs</h4>

Home：[http://pyjs.org/]

这是从 GWT（Google Web Toolkit）移植的第三方库。提供了 Python 到 JS 的编译，AJAX 框架等功能。

Pyjamas 甚至能用来开发桌面 GUI 应用。

<h4>pyjaco</h4>

Home：[https://github.com/chrivers/pyjaco]

这也是一个 Python 到 JavaScript 的编译工具。

== 4.5 浏览器整合 ==

<h4>webbrowser</h4>

【标准库】

操纵当前系统的默认浏览器，访问指定 URL 的页面。

代码示例——用默认浏览器打开 Google 主页
<source lang="python">
import webbrowser
webbrowser.open("http://www.google.com")
</source>

<h4>pyv8</h4>

Home：[https://pypi.python.org/pypi/PyV8]

[https://developers.google.com/v8/ v8] 是 Google 开发的 JavaScript 解释引擎。这是对 v8 引擎的 Python 封装。

代码示例
<source lang="python">
import PyV8

ctxt1 = PyV8.JSContext()
ctxt1.enter()
ctxt1.eval("1+2")  # 对 JS 表达式求值

class Global(PyV8.JSClass) :  # 定义一个兼容 JS 的类
    def hello(self) :
        print("Hello, world")

ctxt2 = PyV8.JSContext(Global())  # 创建一个 JS 上下文，传入 Global 类的对象
ctxt2.enter()                    
ctxt2.eval("hello()")  # 调用 hello() 函数
</source>

<h4>PyWebKitGtk</h4>

Home：[https://github.com/jmalonzo/pywebkitgtk]

[http://webkitgtk.org/ WebKitGtk] 是一个基于 WebKit 的 Web 渲染引擎。

PyWebKitGtk 则提供了对 WebKitGtk 的 Python 封装。

== 4.6 WebSocket ==

（关于 WebSocket 的介绍，可以参见维基百科的“[https://zh.wikipedia.org/wiki/WebSocket 这个链接]”）
<h4>pywebsocket</h4>

Home：[https://github.com/google/pywebsocket]

这是 Google 提供的 WebSocket【服务端】。

该项目包含一个可独立运行的 server 以及一个 Apache 扩展模块（mod_pywebsocket）。

<h4>AutobahnPython</h4>

Home：[https://github.com/crossbario/autobahn-python]

这是 [http://crossbar.io/autobahn Autobahn] 项目的子项目，同时提供了 WebSocket 的“服务端 & 客户端”。

它兼容 Python2 和 Python3，另外还兼容 PyPy 和 Jython。

网络方面，它可以跟“asyncio 标准库”以及“[https://en.wikipedia.org/wiki/Twisted_%28software%29 Twisted]”整合。

除了实现 WebSocket 协议，它还完整实现了 WAMP（Web Application Messaging Protocol）。

代码示例——Echo Server
<source lang="python">
from autobahn.twisted.websocket import WebSocketServerProtocol

class MyServerProtocol(WebSocketServerProtocol) :
    def onConnect(self, request) :
        print("Client connecting: {}".format(request.peer))

    def onOpen(self) :
        print("WebSocket connection open.")

    def onMessage(self, payload, isBinary) :
        if isBinary :
            print("Binary message received: {} bytes".format(len(payload)))
        else:
            print("Text message received: {}".format(payload.decode("utf8")))
        self.sendMessage(payload, isBinary)

    def onClose(self, wasClean, code, reason) :
        print("WebSocket connection closed: {}".format(reason))
</source>

<h4>ws4py</h4>

Home：[https://github.com/Lawouach/WebSocket-for-Python]

此项目同时提供了 WebSocket 的“服务端 & 客户端”；并同时兼容 Python2 和 Python3。

其【服务端】可以跟“CherryPy、gevent、wsgiref、asyncio”整合；其【客户端】可以跟“Tornado、gevent”整合。

== 4.7 （其它） ==

<h4>selenium</h4>

Home：[http://www.seleniumhq.org/]

selenium 是一个非常优秀的框架，用于爬虫和 Web 自动化测试。

代码示例——模拟登录
<source lang="python">
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://192.168.1.1")
driver.find_element_by_xpath('//*[@id="lgPwd"]').send_keys("123456")
driver.find_element_by_xpath('//*[@id="loginSub"]').click()
driver.quit()
</source>

<h4>scrapy</h4>

Home：[https://scrapy.org/]

Links：[https://en.wikipedia.org/wiki/Scrapy Wikipedia]

Scrapy 是一个为了爬取网站数据，提取结构性数据而编写的应用框架。

可以应用在包括数据挖掘，信息处理或存储历史数据等一系列的程序中。

----

= 5 网络 =

== 5.1 链路层 & 网络层 ==

<h4>Scapy</h4>

Home：[http://www.secdev.org/projects/scapy/]

Links：[https://en.wikipedia.org/wiki/Scapy Wikipedia]

这是一个底层的网络库，可以在不同协议层次构造网络数据包（包括链路层、网络层、传输层），还支持 Sniffer 抓包。

搞网络安全的网友应该会喜欢这个库。

代码示例
<source lang="python">
# 传统的 ping 扫描（网络层）
ans,unans = sr(IP(dst="192.168.1.1-254")/ICMP())

&#35; 局域网内的 ARP 扫描（链路层）
ans,unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.0/24"), timeout=2)
</source>

== 5.2 传输层 ==

<h4>socket</h4>

Python 标准库很早就提供了对 socket 编程的支持。

这个标准库是对伯克利套接字进行简单的封装，其 API 基本上跟 BSD SOCKET 一一对应。

<h4>asyncore</h4>

这个标准库提供了异步 SOCKET 的支持。

<h4>asynchat</h4>

这个标准库基于上述的 asyncore，提供更高层的 API，简化异步通讯编程。

== 5.3 标准的应用层 ==

=== 5.3.1 综合性的库 ===

<h4>PycURL</h4>

Home：[http://pycurl.sourceforge.net/]

[https://en.wikipedia.org/wiki/Curl cURL] 是一个功能很强的网络库/网络工具，支持 N 多应用层协议。俺在前几年写过一篇博文推荐它（在“[https://program-think.blogspot.com/2009/03/opensource-review-curl-library.html 这里]”）。

看名称就能猜到——PycURL 是 cURL 的 Python 封装。

代码示例——发起 HTTP GET 请求
<source lang="python">
import pycurl
try :
    from io import BytesIO
except ImportError :
    from StringIO import StringIO as BytesIO

buffer = BytesIO()
curl = pycurl.Curl()
curl.setopt(curl.URL, "http://pycurl.sourceforge.net/")
curl.setopt(curl.WRITEDATA, buffer)
curl.perform()
curl.close()
body = buffer.getvalue()
</source>

=== 5.3.2 HTTP ===

（关于“HTTP 协议”，请参见另一个大类：“Web”）

=== 5.3.3 文件传输 ===

<h4>ftplib</h4>

【标准库】

封装 FTP（File Transfer Protocol）协议

代码示例——列出 FTP 服务器上某目录的内容
<source lang="python">
from ftplib import FTP

ftp = FTP("ftp.debian.org")  # 连接服务器（如果不指定端口号，则用默认端口号 21）
ftp.login()                  # 登录（如果不指定用户名和密码，则用匿名登录）
ftp.cwd("debian")            # 切换到 "debian" 目录
ftp.retrlines("LIST")        # 列出当前目录的内容
ftp.quit()
</source>

<h4>pysftp</h4>

Home：[https://bitbucket.org/dundeemt/pysftp]

封装 [https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol SFTP] 协议，依赖于 ssh.py

代码示例——简单的上传/下载
<source lang="python">
import pysftp

with pysftp.Connection("hostxxx", username="userxxx", password="xxxxxx") as sftp :
    with sftp.cd("public")              # 服务端当前目录切换到 public
        sftp.put("/my/local/filename")  # 上传某个本地文件到服务端的 public 目录
    sftp.get_r("myfiles", "/local")     # 递归复制某个服务端的目录到本地
</source>

=== 5.3.4 电子邮件 ===

<h4>smtplib</h4>

【标准库】

封装 SMTP（Simple Mail Transfer Protocol）协议

<h4>imaplib</h4>

【标准库】

封装 IMAP（Internet Message Access Protocol）协议

<h4>poplib</h4>

【标准库】

封装 POP3（Post Office Protocol v3）协议

<h4>yagmail</h4>

Home：[https://github.com/kootenpv/yagmail]

一个非常简单易用的用来发送邮件的第三方库。

代码示例
<source lang="python">
import yagmail

yag = yagmail.SMTP("my_gmail_username", "my_gmail_password")
contents = ["This is the body, and here is just text http://somedomain/image.png",
            "You can find an audio file attached.', '/local/path/song.mp3"]
yag.send("to@someone.com", "subject", contents)
</source>

=== 5.3.5 即时通讯 ===

<h4>jabber.py</h4>

Home：[http://jabberpy.sourceforge.net/]

Jabber（又称 XMPP）是IM（即时通信）协议的标准。这是用 Python 封装的第三方库。

<h4>irclib</h4>

Home：[https://bitbucket.org/jaraco/irc]

IRC 是 Internet Relay Chat 的缩写。这是用 Python 封装的第三方库。

<h4>pyTelegramBotAPI</h4>

Home：[https://github.com/eternnoir/pyTelegramBotAPI]

一个简单、易用的 [https://core.telegram.org/bots TelegramBot] 封装。

<h4>Telethon</h4>

Home：[https://github.com/LonamiWebs/Telethon]

纯 Python3 的 [https://telegram.org/ Telegram] 客户端封装。

=== 5.3.6 远程控制 ===

<h4>telnetlib</h4>

【标准库】

封装 telnet 协议

代码示例——使用 telnet 登录到某个主机并执行简单命令
<source lang="python">
import telnetlib
import getpass

host = raw_input("Enter remote host: ")
user = raw_input("Enter your remote account: ")
password = getpass.getpass()

tn = telnetlib.Telnet(host)

tn.read_until("login: ")
tn.write(user + "\n")

if password :
    tn.read_until("Password: ")
    tn.write(password + "\n")

tn.write("ls\n")
tn.write("exit\n")

print tn.read_all()
</source>

<h4>rdpy</h4>

Home：[https://github.com/citronneur/rdpy]

纯 Python 实现的 RDP（[https://en.wikipedia.org/wiki/Remote_Desktop_Protocol 微软远程桌面协议]）和 VNC（[https://en.wikipedia.org/wiki/Virtual_Network_Computing Virtual Network Computing]）客户端，依赖于 Twisted 库

<h4>paramiko</h4>

Home：[http://www.paramiko.org/]

paramiko 是用 python 语言写的一个模块，遵循SSH2协议，支持以加密和认证的方式，进行远程服务器的连接。

除了 SSH 协议之外，paramiko 还支持SFTP。

代码示例
<source lang="python">
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("IP",  port, "username", "password")
</source>

=== 5.3.7 （其它） ===

<h4>urlparse</h4>

【标准库】

用于解析 URL，提取各个部分的内容。从 Python 2.5 版本开始加入到标准库中，从 Python 2.7 开始支持包含 IPv6 的 URL

== 5.4 自定义的应用层 ==

<h4>Protocol Buffers</h4>

Home：[https://developers.google.com/protocol-buffers/]

Links：[https://en.wikipedia.org/wiki/Protocol_Buffers Wikipedia]

这是 Google 开发的一个跨语言的库，用于网络传输业务数据时的“编码/解码”。

其优点是：跨多种语言、高性能、向前兼容、向后兼容。俺前几年写过一篇博文推荐 protobuf（在“[https://program-think.blogspot.com/2009/05/opensource-review-protocol-buffers.html 这里]”）。

作为 Protocol Buffers 的发明者，Google 默认实现了三种编程语言（C++、Java、Python）对它的支持。

<h4>Apache Thrift</h4>

Home：[https://thrift.apache.org/]

Links：[https://en.wikipedia.org/wiki/Apache_Thrift Wikipedia]

来自于 Apache 社区，提供了一种跨语言的通讯机制。

程序员通过 Thrift 的“接口定义语言”定义通讯协议格式，然后 Thrift 根据协议格式自动帮你生成服务端和客户端代码。

（在这个方面，它有点类似于 Google 的 Protocol Buffers）

== 5.5 网络库、框架、中间件 ==

<h4>Twisted</h4>

Home：[http://twistedmatrix.com/]

Links：[https://en.wikipedia.org/wiki/Twisted_%28software%29 Wikipedia]

这是一个基于 Python 网络通讯开发框架，诞生于2002年，名气很大。

它的某些设计类似于 C++ 的 [https://en.wikipedia.org/wiki/Adaptive_Communication_Environment ACE] 框架。除了能用来进行传输层（TCP UDP）的开发，还提供了若干应用层协议（HTTP、XMPP、SSH、IRC ...）的支持。

代码示例——实现一个简单的 Echo 服务，监听在 12345 端口
<source lang="python">
from twisted.internet import protocol, reactor

class Echo(protocol.Protocol) :
    def dataReceived(self, data) :
        self.transport.write(data)

class EchoFactory(protocol.Factory) :
    def buildProtocol(self, addr) :
        return Echo()

reactor.listenTCP(12345, EchoFactory())
reactor.run()
</source>

<h4>gevent</h4>

Home：[http://www.gevent.org/]

这是一个基于[https://zh.wikipedia.org/wiki/%E5%8D%8F%E7%A8%8B 协程]的网络库，原先其底层依赖于 libevent，后来改为 libev。

很多开源项目用到了 gevent，具体参见 [https://github.com/gevent/gevent/wiki/Projects gevent 官方的 wiki]。

代码示例——并发执行网络请求
<source lang="python">
from gevent import socket
import gevent

hosts = ["google.com", "github.com", "program-think.blogspot.com"]
jobs = [gevent.spawn(socket.gethostbyname, host) for host in hosts]
gevent.joinall(jobs, timeout=2)
print([job.value for job in jobs])
</source>

<h4>PyZMQ</h4>

Home：[https://github.com/zeromq/pyzmq]

这是 ZMQ（ZeroMQ）的 Python 封装库。同时支持 Python2 和 Python3。

PyZMQ 2.2 之后的版本同时支持 ZMQ 的 3.x 和 4.x 版本。

<h4>nanomsg-python</h4>

Home：[https://github.com/tonysimpson/nanomsg-python]

这是 nanomsg 的 Python 封装库。同时支持 Python2 和 Python3。

代码示例——Hello world
<source lang="python">
from &#95;&#95;future&#95;&#95; import print_function
from nanomsg import Socket, PAIR, PUB

s1 = Socket(PAIR)
s2 = Socket(PAIR)
s1.bind("inproc://test")
s2.connect("inproc://test")
s1.send(b"hello world")
print(s2.recv())
s1.close()
s2.close()
</source>

== 5.6 云计算 ==

<h4>Apache Libcloud</h4>

Home：[https://libcloud.apache.org/]

如今云提供商越来越多。这个库提供了统一的 API 让你访问各大知名云提供商提供的各种服务。

代码示例——创建 DNS 记录
<source lang="python">
from libcloud.dns.types import Provider, RecordType
from libcloud.dns.providers import get_driver

cls = get_driver(Provider.ZERIGO)
driver = cls("email", "api key")

zones = driver.list_zones()
zone = [zone for zone in zones if zone.domain == "mydomain.com"][0]

record = zone.create_record(name="www", type=RecordType.A, data="127.0.0.1")
print(record)
</source>

----

= 6 数据库 =

为了便于数据库开发，Python 社区制定了数据库的 API 规范（[https://www.python.org/dev/peps/pep-0249/ PEP 249]）。

只要是涉及到数据库操作，标准库和大部分第三方库都会遵循该规范（请看如下几个模块的示例代码）。

== 6.1 数据库中间件 ==

=== 6.1.1 ODBC ===

<h4>pyODBC</h4>

Home：[https://github.com/mkleehammer/pyodbc]

pyODBC 封装了 ODBC API，通过它可以访问各种数据库（只要有 ODBC 驱动即可）。

代码示例——查询某个 ODBC 数据源的某个表
<source lang="python">
import pyodbc

conn = pyodbc.connect("DSN=xxx;PWD=password")
cursor = conn.cursor()
cursor.execute("SELECT field1 FROM table1")

while True :
    row = cursor.fetchone()
    if not row :
        break
    print(row)

cursor.close()
conn.close()
</source>

<h4>ceODBC</h4>

Home：[http://ceodbc.sourceforge.net/]

又一个封装 ODBC API 的第三方库

=== 6.1.2 JDBC ===

<h4>Jython</h4>

Jython 前面已经介绍过。有了它，你可以基于 [https://en.wikipedia.org/wiki/Jdbc JDBC] 操作数据库。

=== 6.1.3 ADO & ADO.NET ===

<h4>PyWin32</h4>

PyWin32 前面已经介绍过。有了它，你可以基于 [https://en.wikipedia.org/wiki/ActiveX_Data_Objects ADO] 操作数据库。

<h4>IronPython</h4>

IronPython 前面已经介绍过。有了它，你可以基于 [https://en.wikipedia.org/wiki/ADO.NET ADO.NET] 操作数据库。

== 6.2 特定数据库 ==

=== 6.2.1 MySQL ===

<h4>MySQL for Python</h4>

Home：[http://mysql-python.sourceforge.net/]

操作 MySQL 的第三方库。

代码示例——查询某个 MySQL 数据库的某个表
<source lang="python">
import MySQLdb

conn = MySQLdb.connect(db="test", passwd="password")
cursor = conn.cursor()
cursor.execute("SELECT field1 FROM table1")

while True :
    row = cursor.fetchone()
    if not row :
        break
    print(row)

cursor.close()
conn.close()
</source>

=== 6.2.2 PostgreSQL ===

<h4>psycopg</h4>

Home：[http://initd.org/psycopg/]

操作 PostgreSQL 的第三方库。

<h4>PyGreSQL</h4>

Home：[http://www.pygresql.org/]

操作 PostgreSQL 的第三方库。

=== 6.2.3 Oracle ===

<h4>cx_Oracle</h4>

Home：[http://cx-oracle.sourceforge.net/]

操作 Oracle 的第三方库。

=== 6.2.4 MS SQL Server ===

<h4>pymssql</h4>

Home：[http://pymssql.org/]

操作微软 SQL Server 的第三方库。

=== 6.2.5 IBM DB2 ===

<h4>ibm-db</h4>

Home：[https://pypi.python.org/pypi/ibm_db]

操作 DB2 的第三方库。

=== 6.2.6 SQLite ===

<h4>sqlite3</h4>

【标准库】

sqlite3 从 Python 2.5 版本开始加入到标准库中。通过它，你可以很方便地操作 SQLite 数据库。

[https://en.wikipedia.org/wiki/SQLite SQLite] 是一个很优秀的轻量级数据库，俺前几年写过一篇博文推荐它（在“[https://program-think.blogspot.com/2009/04/how-to-use-sqlite.html 这里]”）。

代码示例——创建一个内存数据库，建表并插入记录
<source lang="python">
import sqlite3
conn = sqlite3.connect(":memory:")  # ":memory:" 表示这是一个内存数据库
cursor = conn.cursor()
cursor.execute("CREATE TABLE person (name text, age int)")
cursor.execute("INSERT INTO stocks VALUES ('TOM',20)")
conn.commit()
conn.close()
</source>

=== 6.2.7 MongoDB ===

<h4>PyMongo</h4>

Docs：[https://docs.mongodb.com/ecosystem/drivers/python/]

这是 MongoDB 官方提供的 Python 驱动。

=== 6.2.8 Apache HBase ===

<h4>HappyBase</h4>

Home：[https://github.com/wbolster/happybase]

操作 HBase 的 Python 库，基于 [https://en.wikipedia.org/wiki/Apache_Thrift Thrift] 连接到 HBase。

代码示例——简单的存取操作
<source lang="python">
import happybase
connection = happybase.Connection("hostname")
table = connection.table("table-name")
table.put(b"row-key", {b"test1": b"data1", b"test2": b"data2"})
row = table.row(b"row-key")
print(row[b"test1"])
</source>

=== 6.2.9 Redis ===

<h4>redis-py</h4>

Home：[https://github.com/andymccurdy/redis-py]

操作 Redis 的第三方 Python 客户端。

代码示例——简单的存取操作
<source lang="python">
import redis
r = redis.StrictRedis(host="localhost", port=6379, db=0)
r.set("foo", "bar")
print(r.get("foo"))
</source>

=== 6.2.10 LevelDB ===

<h4>Plyvel</h4>

Home：[https://github.com/wbolster/plyvel]

操作 LevelDB 的 Python 库，速度快，同时兼容 Python2 和 Python3。

代码示例——简单的存取操作
<source lang="python">
import plyvel
db = plyvel.DB("/tmp/testdb/", create_if_missing=True)
db.put(b"key", b"value")
print(db.get(b"key"))
db.close()
</source>

=== 6.2.11 Berkeley DB ===

<h4>PyBSDDB</h4>

Home：[http://www.jcea.es/programacion/pybsddb.htm]

操作 Berkeley DB 的第三方库。

== 6.3 ORM（Object-Relational Mapping） ==

<h4>SQLAlchemy</h4>

Home：[http://www.sqlalchemy.org/]

Links：[https://en.wikipedia.org/wiki/SQLAlchemy Wikipedia] [https://zh.wikipedia.org/wiki/SQLAlchemy 维基百科]

SQLAlchemy 支持的数据库有：MySQL、PostgreSQL、Sqlite、Oracle、MS SQL Server、Firebird、Sybase SQL Server、Informix、等。

代码示例——通过对象的方式创建两张依赖关系的表
<source lang="python">
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relation, sessionmaker

Base = declarative_base()

class Movie(Base) :
    &#95;&#95;tablename&#95;&#95; = "movies"

    id = Column(Integer, primary_key=True)
    title = Column(String(255), nullable=False)
    year = Column(Integer)
    directed_by = Column(Integer, ForeignKey("directors.id"))
    director = relation("Director", backref="movies", lazy=False)

    def &#95;&#95;init&#95;&#95;(self, title=None, year=None) :
        self.title = title
        self.year = year

    def &#95;&#95;repr&#95;&#95;(self) :
        return "Movie(%r, %r, %r)" % (self.title, self.year, self.director)

class Director(Base) :
    &#95;&#95;tablename&#95;&#95; = "directors"

    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False, unique=True)

    def &#95;&#95;init&#95;&#95;(self, name=None) :
        self.name = name

    def &#95;&#95;repr&#95;&#95;(self) :
        return "Director(%r)" % (self.name)

Base.metadata.create_all(create_engine("dbms://user:pwd@host/dbname"))
</source>

<h4>SQLObject</h4>

Home：[http://sqlobject.org/]

Links：[https://en.wikipedia.org/wiki/SQLObject Wikipedia]

SQLObject 支持的数据库有：MySQL、PostgreSQL、Sqlite、MS SQL Server、Firebird、Sybase SQL Server、SAP DB、等。

代码示例——通过对象的方式创建表
<source lang="python">
from sqlobject import *
sqlhub.processConnection = connectionForURI("sqlite:/:memory:")

class Person(SQLObject) :
    first_name = StringCol()
    last_name = StringCol()

Person.createTable()
</source>

<h4>Peewee</h4>

Home：[http://www.peewee-orm.com/]

一个轻量级的 ORM，支持 SQLite、MySQL 和 PostgreSQL，通过插件机制支持更多数据库。

同时支持 Python2 和 Python3。

代码示例——通过对象的方式创建表
<source lang="python">
from peewee import *

db = SqliteDatabase("test.db")

class Person(Model) :
    name = CharField()
    birthday = DateField()
    is_relative = BooleanField()
    class Meta :
        database = db  # This model uses the "test.db".

class Pet(Model) :
    owner = ForeignKeyField(Person, related_name="pets")
    name = CharField()
    animal_type = CharField()
    class Meta :
        database = db  # This model uses the "test.db".

db.connect()
db.create_tables([Person, Pet])
</source>

----

= 7 GUI =

== 7.1 GUI 框架 ==

=== 7.1.1 基于 Tk ===

[https://en.wikipedia.org/wiki/Tk_(framework) Tk] 是一个跨平台的界面组件库。

<h4>Tkinter & tkinter</h4>

【标准库】

这是 Python 内置的标准库，封装了 Tcl/Tk 界面库。

Python2 的模块名叫 Tkinter，到 Python3 模块名改为 tkinter

代码示例——用 Tkinter 写 Hello world
<source lang="python">
from Tkinter import *

if &#95;&#95;name&#95;&#95; == "&#95;&#95;main&#95;&#95;" :
    root = Tk()
    label = Label(root, text="Hello, world")
    label.pack()
    root.mainloop()
</source>

=== 7.1.2 基于 wxWidgets ===

[https://en.wikipedia.org/wiki/WxWidgets wxWidgets] 是 C++ 开发的跨平台框架（不仅包括 GUI，还有其它功能）。
<h4>wxPython</h4>

Home：[http://www.wxpython.org/]

Links：[https://en.wikipedia.org/wiki/WxPython Wikipedia] [https://zh.wikipedia.org/wiki/WxPython 维基百科]

在所有的 wxWidgets 的 Python 封装库中，这个是名气最大的。

[https://github.com/limodou/ulipad Ulipad]（知名的国产的 Python IDE）就是基于 wxPython 开发的。

代码示例——用 wxPython 写 Hello world
<source lang="python">
import wx

class Frame(wx.Frame) :
    pass

class App(wx.App) :
    def OnInit(self) :
        self.frame = Frame(parent=None, title="Hello, world")
        self.frame.Show()
        self.SetTopWindow(self.frame)
        return True

if &#95;&#95;name&#95;&#95; == "&#95;&#95;main&#95;&#95;" :
    app = App()
    app.MainLoop()
</source>

<h4>PythonCard</h4>

Home：[http://pythoncard.sourceforge.net/]

又一个基于 wxWidgets 的 GUI 库。

=== 7.1.3 基于 GTK+ ===

[https://en.wikipedia.org/wiki/GTK%2B GTK+] 全称是（GIMP Toolkit），由 C 开发的跨平台界面组件库。
<h4>PyGTK</h4>

Home：[http://www.pygtk.org/]

Links：[https://en.wikipedia.org/wiki/PyGTK Wikipedia]

它是 Python 对 GTK+2 的封装。

代码示例——用 PyGTK 写 Hello world
<source lang="python">
import pygtk
pygtk.require("2.0")
import gtk

class HelloWorld :
    def &#95;&#95;init&#95;&#95;(self) :
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect("delete_event", self.delete_event)
        self.window.connect("destroy", self.destroy)
        self.window.set_border_width(10)

        self.button = gtk.Button("Hello, world")
        self.button.connect("clicked", self.hello, None)
        self.button.connect_object("clicked", gtk.Widget.destroy, self.window)
        self.window.add(self.button)

        self.button.show()
        self.window.show()

    def main(self) :
        gtk.main()

    def hello(self, widget, data=None) :
        print("Hello, world")

    def delete_event(self, widget, event, data=None) :
        print("delete event occurred")
        return False

    def destroy(self, widget, data=None) :
        gtk.main_quit()

if &#95;&#95;name&#95;&#95; == "&#95;&#95;main&#95;&#95;" :
    hello = HelloWorld()
    hello.main()
</source>

<h4>PyGObject（PyGI）</h4>

Home：[https://live.gnome.org/PyGObject]

它是 Python 对 GTK+3 的封装。PyGTK 的官网也推荐它。

代码示例——用 PyGObject 写 Hello world
<source lang="python">
from gi.repository import Gtk

class MyWindow(Gtk.Window):
    def &#95;&#95;init&#95;&#95;(self):
        Gtk.Window.&#95;&#95;init&#95;&#95;(self, title="Hello World")

        self.button = Gtk.Button(label="Click Here")
        self.button.connect("clicked", self.on_button_clicked)
        self.add(self.button)

    def on_button_clicked(self, widget):
        print("Hello, world!")

win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
</source>

=== 7.1.4 基于 Qt ===

[https://en.wikipedia.org/wiki/Qt_(toolkit) Qt] 是 C++ 开发的跨平台框架（不仅包括 GUI，还有其它功能）。

<h4>PyQt</h4>

Home：[http://www.riverbankcomputing.com/software/pyqt/]

Links：[https://en.wikipedia.org/wiki/PyQt Wikipedia] [https://zh.wikipedia.org/wiki/PyQt 维基百科]

这是 Python 对 Qt 的封装。

代码示例——用 pyQt 写 Hello world
<source lang="python">
import sys
from PyQt4.QtGui import *

if &#95;&#95;name&#95;&#95; == "&#95;&#95;main&#95;&#95;" :
    app = QApplication(sys.argv)
    window = QWidget()

    window.resize(320, 240)
    window.setWindowTitle("Hello, world")
    window.show()
    sys.exit(app.exec_())
</source>

<h4>PySide</h4>

Home：[http://www.pyside.org/]

这也是 Python 对 Qt 的封装。

=== 7.1.5 基于 FLTK ===

[https://en.wikipedia.org/wiki/FLTK FLTK] 全称是（Fast Light Tool Kit），由 C++ 开发的跨平台、轻量级界面组件库。
<h4>PyFLTK</h4>

Home：[http://pyfltk.sourceforge.net/]

这是 Python 对 FLTK 的封装。

=== 7.1.6 基于 Windows 平台 ===

<h4>PyWin32</h4>

PyWin32 前面已经介绍过。它可以提供原生的 Windows GUI 界面。

<h4>IronPython</h4>

IronPython 前面已经介绍过。它可以提供 dotNET 的 GUI 界面。

=== 7.1.7 基于 JVM 平台 ===

<h4>Jython</h4>

Jython 前面已经介绍过。它可以提供基于 Java 的 [https://en.wikipedia.org/wiki/Swing_%28Java%29 Swing] 界面。

=== 7.1.8 （其它） ===

<h4>EasyGUI</h4>

Home：[http://easygui.sourceforge.net/]

EasyGUI 这是一个很轻量级的库。跟其它 GUI 不同之处在于——它没有“事件驱动”。

<h4>PyGUI</h4>

Home：[http://www.cosc.canterbury.ac.nz/greg.ewing/python_gui/]

PyGUI 是一个更高层的 GUI 库，底层分别封装了 [http://python.net/crew/mhammond/win32/ PyWin32]（Windows 平台）、[http://www.pygtk.org/ PyGTK]（Linux 平台）、[http://pyobjc.sourceforge.net/ PyObjC]（Mac OS X 平台）。

<h4>Kivy</h4>

Home：[http://kivy.org/]

跨平台的多媒体框架和界面库，用来开发比较炫的界面。

除了支持桌面操作系统，还支持 Android / iOS，支持多点触摸。

<h4>OcempGUI</h4>

Home：[http://ocemp.sourceforge.net/gui.html]

基于 PyGame 的一个跨平台 GUI 库（PyGame 下面会提到）。

== 7.2 图表 & 报表 ==

<h4>matplotlib</h4>

Home：[http://matplotlib.org/]

Links：[https://en.wikipedia.org/wiki/Matplotlib Wikipedia]

这是一个有名的图形库，主要用来绘制数学相关的图形。

它跟后面提到的 [http://www.scipy.org/ SciPy] 整合可以起到类似 MATLAB 的效果。效果图在“[http://matplotlib.org/users/screenshots.html 这里]”。

<h4>Gnuplot.py</h4>

Home：[http://gnuplot-py.sourceforge.net/]

这是 Python 对 [http://www.gnuplot.info/ gnuplot] 的封装。gnuplot 的效果图在“[http://www.gnuplot.info/screenshots/index.html 这里]”。

<h4>PyQtGraph</h4>

Home：[http://www.pyqtgraph.org/]

这是一个纯 Python 的库，依赖于 PyQt4 / PySide。效果图在“[http://www.pyqtgraph.org/images/plotting_sm.png 这里]”。

<h4>PyX</h4>

Home：[http://pyx.sourceforge.net/]

这个库可以跟 TeX / LaTeX 无缝整合，支持导出为 PostScript / PDF 格式。适合用来制作报表。效果图在“[http://pyx.sourceforge.net/gallery/index.html 这里]”。

<h4>Chaco</h4>

Home：[http://code.enthought.com/chaco/]

这是一个商业公司维护的库，主要提供2维图表。效果图在“[http://docs.enthought.com/chaco/user_manual/annotated_examples.html 这里]”。

<h4>Plotly</h4>

Home：[https://plot.ly/]

plotly 是现代平台的敏捷商业智能和数据科学库。

它作为一款开源的绘图库，可以应用于 Python、R、MATLAB、Excel、JavaScript、jupyter 等多种语言。

----

= 8 信息安全 =

== 8.1 密码学 ==

<h4>hashlib</h4>

【标准库】

在 Python 2.5 版本加入到标准库中。通过它，你可以很方便地计算各种散列值。

它支持的哈希算法有：MD5 SHA1 SHA224 SHA256 SHA384 SHA512

关于散列算法，俺写过一篇扫盲（在“[https://program-think.blogspot.com/2013/02/file-integrity-check.html 这里]”）。

代码示例——计算字符串的 SHA1 散列值
<source lang="python">
import hashlib
sha1 = hashlib.sha1("Hello, world").hexdigest()
</source>

<h4>PyCrypto</h4>

Home：[http://www.dlitz.net/software/pycrypto/]

这个库包含了常见的对称加密算法（DES、AES、IDEA 等）、公钥加密算法（RSA、DSA 等）、散列算法（MD5、SHA1、RIPEMD 等）。

<h4>pyOpenSSL</h4>

Home：[http://pyopenssl.sourceforge.net/]

[https://en.wikipedia.org/wiki/OpenSSL OpenSSL] 在加密领域可是大名鼎鼎。这个库使用 Python 对 OpenSSL 进行很薄的封装。

<h4>Keyczar</h4>

Home：[https://github.com/google/keyczar]

这是 Google 提供的加密库，同时提供 C++、Java、Python 三种语言的实现。

它提供了比较高层的 API， 使用者无需关心太多的细节。

<h4>passlib</h4>

Home：[https://bitbucket.org/ecollins/passlib/]

passlib 是一个久经考验的非常成熟的跨平台的散列函数库，它所提供的功能包括随机盐密码的生成与验证，两步验证等。

代码示例——验证随机盐密码
<source lang="python">
>>> # import the hash algorithm
>>> from passlib.hash import pbkdf2_sha256

>>> # generate new salt, and hash a password
>>> hash = pbkdf2_sha256.hash("toomanysecrets")
>>> hash
'$pbkdf2-sha256$29000$N2YMIWQsBWBMae09x1jrPQ$1t8iyB2A.WF/Z5JZv.lfCIhXXN33N23OSgQYThBYRfk'

>>> # verifying the password
>>> pbkdf2_sha256.verify("toomanysecrets", hash)
True
>>> pbkdf2_sha256.verify("joshua", hash)
False
</source>

== 8.2 访问控制 ==

<h4>oauth2client</h4>

Home：[https://github.com/google/oauth2client]

这是 Google 提供的 OAuth 客户端，支持 OAuth 2.0 规范。

----

= 9 处理文件格式 =

== 9.1 结构化数据格式 ==

=== 9.1.1 CSV ===

[https://en.wikipedia.org/wiki/Comma-separated_values CSV] 是一种历史悠久的结构化数据存储格式。其效果类似于一张数据库二维表。
<h4>csv</h4>

【标准库】

提供 CSV 格式文件的读写，可以手动指定行列分隔符。

=== 9.1.2 JSON ===

JSON 格式源自 JavaScript，如今在 Web 开发中广为应用。
<h4>json</h4>

【标准库】

提供 JSON 格式的编码和解码。

代码示例——编码/解码 JSON 字符串
<source lang="python">
import json

json.dumps(["foo", {"bar": ("baz", None, 1.0, 2)}])
&#35; JSON 编码
&#35; 得到如下【字符串】
&#35; """["foo", {"bar": ["baz", null, 1.0, 2]}]"""

json.loads("""["foo", {"bar":["baz", null, 1.0, 2]}]""")
&#35; JSON 解码
&#35; 得到如下【对象】
&#35; [u"foo", {u"bar": [u"baz", None, 1.0, 2]}]
</source>

=== 9.1.3 YAML ===

[https://en.wikipedia.org/wiki/YAML YAML] 是一种类似于 json 的结构化数据格式。它在确保可读性的基础上，提供了超越 json 的灵活性和扩展性。
<h4>PyYAML</h4>

Home：[http://pyyaml.org/]

pyyaml 提供了 Python 对 YAML 的封装。

== 9.2 压缩文件 & 打包文件 ==

=== 9.2.1 zip ===

<h4>zipfile</h4>

【标准库】

提供对 zip 格式的读写。

=== 9.2.2 bzip2（bz2） ===

<h4>bz2</h4>

【标准库】

提供对 bzip2 格式的读写。

=== 9.2.3 gzip（gz） ===

<h4>gzip</h4>

【标准库】

提供对 gzip 格式的读写。

<h4>zlib</h4>

【标准库】

提供对 zlib 格式的读写。

=== 9.2.4 tar ===

<h4>tarfile</h4>

【标准库】

提供对 tar 格式的读写。

=== 9.2.5 7zip（7z） ===

<h4>PyLZMA</h4>

Home：[http://www.joachim-bauch.de/projects/pylzma/]

处理 7zip 格式的第三方库。

=== 9.2.6 rar ===

<h4>rarfile</h4>

Home：[http://rarfile.berlios.de/]

处理 rar 格式的第三方库。

=== 9.2.7 msi ===

<h4>msilib</h4>

【标准库】

提供对 msi 格式的读写，从 Python 2.5 版本开始加入标准库。

== 9.3 标记语言 ==

=== 9.3.1 XML ===

<h4>xml.dom & xml.miniDom & xml.etree.ElementTree</h4>

【标准库】

用 DOM（Document Object Model）方式处理 XML 文件。

<h4>xml.sax & xml.parsers.expat</h4>

【标准库】

用 SAX（Simple API for XML）方式处理 XML 文件。

<h4>lxml</h4>

Home：[http://lxml.de/]

著名的 C 语言库 libxml 和 libxslt 的 Python 封装。

功能很强，支持 XPath 1.0、XSLT 1.0、扩展 EXSLT、等。还可以用来解析 HTML 格式。

=== 9.3.2 HTML ===

<h4>HTMLParser</h4>

【标准库】

以回调方式解析 HTML/XHTML 文件内容。

<h4>beautifulsoup</h4>

Home：[https://www.crummy.com/software/BeautifulSoup/]

Links：[https://zh.wikipedia.org/zh-cn/Beautiful_Soup 维基百科]

Beautiful Soup 可以从 HTML 或 XML 文件中提取数据。

它是写”爬虫“的利器，通常与 requests 或 selenium 配合。

== 9.4 PDF ==

<h4>pyfpdf</h4>

Home：[https://github.com/reingart/pyfpdf]

这是 [http://www.fpdf.org/ FPDF] 的 Python 移植库，用来生成 PDF 文档。

支持的功能比较全（嵌入字体、嵌入图片），文档也比较详细。

代码示例——简单的 Hello World 示例
<source lang="python">
from fpdf import FPDF

pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", "B", 16)
pdf.cell(40, 10, "Hello, World")
pdf.output("test.pdf", "F")
</source>

代码示例——支持写入 HTML 语法（目前支持几种常见的 HTML tag）
<source lang="python">
from pyfpdf import FPDF, HTMLMixin

class MyFPDF(FPDF, HTMLMixin) :
    pass
              
pdf = MyFPDF()
pdf.add_page()
pdf.write_html(html)
pdf.output("test.pdf", "F")
</source>

<h4>pyPdf & PyPDF2</h4>

Home：[http://knowah.github.com/PyPDF2/]

pyPdf 目前已经不继续升级维护了。PyPDF2 是从 pyPdf 派生出来的，并继续增加新功能。

它除了可以提取文件属性，还可以切分/合并文档，加密/解密文档。

<h4>PDFMiner</h4>

Home：[http://www.unixuser.org/~euske/python/pdfminer/]

它可以提取 PDF 文件属性以及每页的文本，支持把内容输出为 HTML 格式。

== 9.5 MS Office 文档 ==

=== 9.5.1 Word（doc、docx） ===

<h4>python-docx</h4>

Home：[https://github.com/python-openxml/python-docx]

纯 python 实现的 docx 操作库，能够处理 docx 中的“文本、图片、样式”。

同时支持 Python2 和 Python3。

<h4>PyWin32</h4>

PyWin32 前面已经介绍过。它可以基于 [https://en.wikipedia.org/wiki/Component_Object_Model COM] 操作 Office 文档，包括 Word。

（本地需要安装 Office）

=== 9.5.2 Excel（xls、xlsx） ===

<h4>pyExcelerator</h4>

Home：[http://sourceforge.net/projects/pyexcelerator/]

它可以支持 Office Excel（97/2000/XP/2003）以及 OpenOffice Calc 的文档。无需依赖外部软件。

<h4>PyWin32</h4>

PyWin32 前面已经介绍过。它可以基于 [https://en.wikipedia.org/wiki/Component_Object_Model COM] 操作 Office 文档，包括 Excel。

（本地需要安装 Office）

=== 9.5.3 Power Point（ppt、pptx） ===

<h4>python-pptx</h4>

Home：[https://github.com/scanny/python-pptx]

它可以用来生成 pptx（Open XML PowerPoint）格式的文档。

<h4>PyWin32</h4>

PyWin32 前面已经介绍过。它可以基于 [https://en.wikipedia.org/wiki/Component_Object_Model COM] 操作 Office 文档，包括 Power Point。

（本地需要安装 Office）

== 9.6 RTF ==

<h4>PyRTF</h4>

Home：[http://pyrtf.sourceforge.net/]

它可以用来处理 RTF（富文本格式）文档。

== 9.7 CHM ==

<h4>PyCHM</h4>

Home：[http://gnochm.sourceforge.net/pychm.html]

这是基于 [http://www.jedrea.com/chmlib/ chmlib] 的 Python 封装库。可以提取 CHM 文件的属性以及每个页面的内容。

----

= 10 图像 =

== 10.1 图像处理 ==

<h4>Python Imaging Library（PIL）</h4>

Home：[http://www.pythonware.com/products/pil/]

Links：[https://en.wikipedia.org/wiki/Python_Imaging_Library Wikipedia]

这是一个很有名气的 Python 图像处理库，支持常见图像文件格式（BMP、JPG、GIF、PNG ...）。

它可以对图像进行各种常见的处理（旋转、缩放、剪切 ...）。

代码示例——为某个目录下所有 JPEG 创建缩略图
<source lang="python">
import os, glob
from PIL import Image

size = 128, 128
for file in glob.glob("*.jpg"):
    name, ext = os.path.splitext(file)
    img = Image.open(file)
    img.thumbnail(size)
    img.save(name+".thumbnail", "JPEG")
</source>

代码示例——旋转某图片并显示
<source lang="python">
from PIL import Image

img = Image.open("xxx.jpg")
img = img.rotate(90)
img.show()
</source>

<h4>Wand</h4>

Home：[http://docs.wand-py.org/]

它通过前面提到 ctypes 实现了对 [https://en.wikipedia.org/wiki/ImageMagick ImageMagick] 的封装（ImageMagick 是最强大的开源图片处理工具集）。

代码示例——旋转并缩放某图片
<source lang="python">
from wand.image import Image
from wand.display import display

with Image(filename="mona-lisa.png") as img :
    print(img.size)
    for r in 1, 2, 3 :
        with img.clone() as new_img :
            new_img.resize(int(new_img.width/2), int(new_img.height/2))
            new_img.rotate(90 * r)
            new_img.save(filename="mona-lisa-{0}.png".format(r))
            display(new_img)
</source>

<h4>Pillow</h4>

Home：[http://python-pillow.org/]

你可以把它视作“轻量级的 PIL”。

它的目标是比 PIL 更容易使用，并尽可能与 PIL 的 API 兼容。

<h4>PyGraphviz</h4>

Home：[https://github.com/pygraphviz/pygraphviz]

[https://en.wikipedia.org/wiki/Graphviz Graphviz] 是一个功能很强大的关系图【自动】生成工具，具体介绍可以参见俺的博文（在“[https://program-think.blogspot.com/2016/02/opensource-review-graphviz.html 这里]”）

这个库如其名所示，提供了 Python 对 Graphviz 的封装（基于 SWIG）。

<h4>Graphviz</h4>

Home：[https://github.com/xflr6/graphviz]

这个库与上一个类似，也提供了 Graphviz 的 Python 的封装。

这两个库都在 GitHub 上。（可能是因为出现较晚）这个库的 Star 和 Fork 数都不如上一个，不过俺感觉文档比较全。

代码示例——创建一个 DOT 图并加入若干节点和连线
<source lang="python">
from graphviz import Digraph

dot = Digraph(comment='The Round Table')
&#35; 添加节点
dot.node('A', 'King Arthur')
dot.node('B', 'Sir Bedevere the Wise')
dot.node('L', 'Sir Lancelot the Brave')
&#35; 添加连线
dot.edges(['AB', 'AL'])
dot.edge('B', 'L', constraint='false')
</source>

== 10.2 图像格式转换 ==

<h4>Python Imaging Library（PIL）</h4>

PIL 前面已经介绍过。它支持常见图像文件格式（BMP、JPG、GIF、PNG ...）之间的相互转换。

<h4>Wand</h4>

Wand 前面已经介绍过。由于它是针对 [https://en.wikipedia.org/wiki/ImageMagick ImageMagick] 的封装。只要 ImageMagick 能转换的格式，它也可以转换。

== 10.3 图像渲染 ==

<h4>Pycairo</h4>

Home：[http://cairographics.org/pycairo/]

[https://en.wikipedia.org/wiki/Cairo_%28graphics%29 Cairo] 是一个图像渲染引擎，提供了矢量图像的渲染功能。支持多种后端输出（包括：Win32 GDI、OpenGL、Xlib、XCB、PDF、PNG、SVG......）。

Pycairo 是 Cairo 官方提供 Python 封装。

= 11 游戏 =

== 11.1 综合性的游戏引擎 ==

<h4>PyGame</h4>

Home：[http://www.pygame.org/]

Links：[https://en.wikipedia.org/wiki/Pygame Wikipedia] [https://zh.wikipedia.org/wiki/Pygame 维基百科]

这是名气很大的跨平台游戏引擎，构建于 [https://zh.wikipedia.org/wiki/SDL SDL]（Simple DirectMedia Layer）之上。

它起先是用来替代终止开发的 pySDL，包含了图像和音频的库。

<h4>Cocos2d</h4>

Home：[http://cocos2d.org/]

它是一个开源的 2D 游戏框架，最初使用 Python 编写的。后来该框架已经被移植到了多种语言和平台上。

其功能包括了：GUI 组件、音效、物理引擎、脚本语言绑定、场景编辑器 ...

很多手机游戏是基于 Cocos2d 的衍生框架开发的。

<h4>Blender Game Engine</h4>

Home：[http://www.blender.org/]

Links：[https://en.wikipedia.org/wiki/Game_Blender Wikipedia] [https://zh.wikipedia.org/wiki/Game_Blender 维基百科]

它是 [https://en.wikipedia.org/wiki/Blender_%28software%29 Blender] 的组成部分，虽然是以 C++ 编写，但内置了 Python 脚本的扩展。

其功能包括：3D 渲染、碰撞检测、角色编辑器、音效、网络通讯、AI ...

== 11.2 3D 渲染引擎 ==

<h4>PyOpenGL</h4>

Home：[http://pyopengl.sourceforge.net/]

封装 [https://en.wikipedia.org/wiki/OpenGL OpenGL] 的 Python 库。

<h4>Python-Ogre</h4>

Home：[http://www.python-ogre.org/]

封装 [https://en.wikipedia.org/wiki/OGRE OGRE] 的 Python 库。

----

= 12 数值计算 & 科学计算 =

<h4>NumPy</h4>

Home：[http://www.numpy.org/]

Links：[https://en.wikipedia.org/wiki/NumPy Wikipedia] [https://zh.wikipedia.org/wiki/NumPy 维基百科]

它提供了功能强大、性能很高的数值数组，可以用来进行各种数值计算（包括矩阵运算）。

代码示例
<source lang="python">
# 以下是传统 Python 写法，冗长且速度较慢
a = range(10000000)
b = range(10000000)
c = []
for i in range(len(a)) :
    c.append(a[i] + b[i])

&#35; 以下是 NumPy 的写法，简洁且速度飞快
import numpy as np
a = np.arange(10000000)
b = np.arange(10000000)
c = a + b
</source>

<h4>SciPy</h4>

Home：[http://www.scipy.org/]

Links：[https://en.wikipedia.org/wiki/SciPy Wikipedia] [https://zh.wikipedia.org/wiki/SciPy 维基百科]

它依赖 NumPy 提供的多维数组。相比 NumPy，它提供了更高层的数学运算模块（统计、线性代数、积分、常微分方程求解、傅立叶变换、信号处理 ...）。

它被广泛用于科研和工程领域。

<h4>SymPy</h4>

Home：[http://sympy.org/]

Links：[https://en.wikipedia.org/wiki/SymPy Wikipedia] [https://zh.wikipedia.org/wiki/SymPy 维基百科]

它是用来做符号计算的，其目标是成为一个全功能的“计算机代数系统”。

它支持的功能包括：符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散数学、几何学、概率与统计 ......

----

= 13 （其它） =

一些不方便归类的，暂时放到这里。

<h4>PyPy</h4>

Home：[http://www.pypy.org/]

Links：[https://en.wikipedia.org/wiki/PyPy Wikipedia] [https://zh.wikipedia.org/wiki/PyPy 维基百科]

它是一个用 Python 写的 Python 解释器（有点绕口令）。

PyPy 支持 JIT（Just-in-time compilation）和沙箱技术，可做到【比 CPython 更快的运行速度】。

