https://github.com/programthink/opensource/blob/master/libs/python.wiki
Python 开源库及示例代码
Table of Contents
说明
1 算法
1.1 字符串
1.1.1 正则表达式
1.1.2 字符集
1.1.3 (其它)
1.2 编码 & 解码
1.2.1 base64
1.2.2 UUencode
1.2.3 BinHex
1.3 数学类
1.4 容器
2 跨语言编程
2.1 整合 C & C++
2.2 整合 JVM 平台
2.3 整合 dotNet 平台
2.4 整合 Go
2.5 整合 Objective-C
3 操作系统
3.1 文件和目录操作
3.2 线程
3.3 进程
3.4 本地进程间通信(IPC)
3.5 操作硬件
3.6 获取系统信息
3.7 Linux & Unix 系统相关
3.8 Windows 系统相关
3.9 程序打包
4 Web
4.1 HTTP Client
4.2 HTTP Server
4.3 Web 开发框架
4.4 Web前端 & JS整合
4.5 浏览器整合
4.6 WebSocket
4.7 (其它)
5 网络
5.1 链路层 & 网络层
5.2 传输层
5.3 标准的应用层
5.3.1 综合性的库
5.3.2 HTTP
5.3.3 文件传输
5.3.4 电子邮件
5.3.5 即时通讯
5.3.6 远程控制
5.3.7 (其它)
5.4 自定义的应用层
5.5 网络库、框架、中间件
5.6 云计算
6 数据库
6.1 数据库中间件
6.1.1 ODBC
6.1.2 JDBC
6.1.3 ADO & ADO.NET
6.2 特定数据库
6.2.1 MySQL
6.2.2 PostgreSQL
6.2.3 Oracle
6.2.4 MS SQL Server
6.2.5 IBM DB2
6.2.6 SQLite
6.2.7 MongoDB
6.2.8 Apache HBase
6.2.9 Redis
6.2.10 LevelDB
6.2.11 Berkeley DB
6.3 ORM(Object-Relational Mapping)
7 GUI
7.1 GUI 框架
7.1.1 基于 Tk
7.1.2 基于 wxWidgets
7.1.3 基于 GTK+
7.1.4 基于 Qt
7.1.5 基于 FLTK
7.1.6 基于 Windows 平台
7.1.7 基于 JVM 平台
7.1.8 (其它)
7.2 图表 & 报表
8 信息安全
8.1 密码学
8.2 访问控制
9 处理文件格式
9.1 结构化数据格式
9.1.1 CSV
9.1.2 JSON
9.1.3 YAML
9.2 压缩文件 & 打包文件
9.2.1 zip
9.2.2 bzip2(bz2)
9.2.3 gzip(gz)
9.2.4 tar
9.2.5 7zip(7z)
9.2.6 rar
9.2.7 msi
9.3 标记语言
9.3.1 XML
9.3.2 HTML
9.4 PDF
9.5 MS Office 文档
9.5.1 Word(doc、docx)
9.5.2 Excel(xls、xlsx)
9.5.3 Power Point(ppt、pptx)
9.6 RTF
9.7 CHM
10 图像
10.1 图像处理
10.2 图像格式转换
10.3 图像渲染
11 游戏
11.1 综合性的游戏引擎
11.2 3D 渲染引擎
12 数值计算 & 科学计算
13 (其它)
说明
本页面汇总俺收集的各种 Python 代码库,不定期更新。
本页面列出的各种 Python 库/模块,如果注明了官网的网址,说明这个库是第三方的;否则就是 Python 语言内置的标准库。
如果你发现本页面的开源库有错漏之处,非常欢迎给俺提供反馈——有 GitHub 帐号的同学,可以给俺发 issue;没帐号的同学,可以去俺博客留言。
1 算法
1.1 字符串
1.1.1 正则表达式
re
【标准库】
提供基于正则的匹配和替换。
chardet 可以猜测任意一段文本的字符集编码。对于编码类型未知的文本,它会很有用。
chardet 既可以作为模块来使用,也可以作为命令行工具来使用。
代码示例
import chardet
print(chardet.detect(bytes))
1.1.3 (其它)
StringIO & cStringIO
【标准库】
以读写文件的方式来操作字符串(有点类似于内存文件)。
cStringIO 是 C 语言实现的,性能更高;而 StringIO 是 Python 实现的,提供 Unicode 兼容性。
difflib
【标准库】
可以对两个字符串进行"按行”比较,其功能类似于命令行的 diff。
另外还支持"最佳匹配”功能——对给定的字符串 s 和字符串列表 l,在 l 里面找到最接近 s 的字符串。
1.2 编码 & 解码
1.2.1 base64
Base64 是一组编码算法的总称。用于把二进制数据编码为文本。
base64
【标准库】
提供 Base16、Base32、Base64 格式的编码和解码。
1.2.2 UUencode
UUencode 出现于早期的 Unix 系统。用于把二进制编码为文本,以便通过邮件系统发送。
uu
【标准库】
提供 UUencode 格式的编码和解码。
1.2.3 BinHex
BinHex 起先用于 Mac OS 系统,类似于 UUencode。
binhex
【标准库】
提供 BinHex 格式的编码和解码。
1.3 数学类
math
【标准库】
顾名思义,这个标准库封装了常用的数学函数(开方、指数、对数、三角函数......)。
random
【标准库】
顾名思义,这个标准库是用来进行随机数生成滴。
代码示例——生成 0-100 的随机数
import random
random.seed()
random.randint(0, 100)
fractions
【标准库】
封装了跟有理数(分数)相关的运算
这是 Google 实现的 trie(前缀树/字典树)封装库。
2 跨语言编程
Python 可以很容易地跟其它编程语言整合。整合之后,就可以在 Python 代码中使用其它编程语言的函数、模块、库,非常爽!
2.1 整合 C & C++
ctypes
ctypes 在 Python 2.5 版本加入到标准库中。
通过它,你可以很方便地调用 C/C++ 动态库导出的函数,可以在 Python 中使用各种 C/C++ 的数据类型(包括"指针”和"引用”)。
代码示例——调用 Linux/Unix 系统的标准 C 函数,获取当前时间
from ctypes import *
libc = CDLL("libc.so.6")
time = libc.time(None)
代码示例——调用 Windows 系统的 API,弹出消息提示框
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)
SWIG(Simplified Wrapper and Interface Generator)
Home:http://swig.org/
Links:Wikipedia
这是一个很老牌的、有名气的工具,它可以把多种语言(Java、Python、C#、Ruby、PHP、Perl、Lua、Go ...)整合到 C/C++ 中。
这个工具可以让你用 Python 的语法写扩展模块的代码,然后它帮你把 Python 代码编译为本地动态库(机器码)。
用它编译出来的扩展模块,其性能跟 C/C++ 编写的扩展模块相当。
2.2 整合 JVM 平台
Jython
Home:http://www.jython.org/
Links:Wikipedia 维基百科
通过 Jython 可以让 Python 代码运行在 JVM 上,并且可以调用其它的 JVM 语言的代码(比如 Java、Scala)
2.3 整合 dotNet 平台
IronPython
Home:http://ironpython.net/
Links:Wikipedia 维基百科
通过 IronPython 可以让 Python 代码运行在 dotNET 平台上,并且可以调用其它的 dotNET 语言的代码(C#、F#、VB.Net ...)
gopy 可以把 Go 源代码编译为 Python 的一个 module。
它提供了两种方式(命令行、Python 库)来实现:Go 源码编译为 Python 模块。
2.5 整合 Objective-C
PyObjC
Home:http://pyobjc.sourceforge.net/
这是用 Python 封装 Mac OS X 上的 Objective-C 库。
3 操作系统
3.1 文件和目录操作
os
【标准库】
这是非常基本的标准库,提供了常见的操作系统相关功能,很多功能是针对文件系统。
shutil
【标准库】
相对于 os 而言,shutil 提供了一些比较高级的文件和目录操作(目录递归复制、目录递归删除、目录压缩打包...)
代码示例——递归删除某个目录
import shutil
shutil.rmtree(xxxx)
glob
【标准库】
用于查找文件,【支持通配符】(* 和 ?)
代码示例——获取当前目录所有 txt 文件
import glob
for file in glob.glob("./*.txt") :
print(file)
fnmatch
【标准库】
用于匹配文件名(支持通配符,类似上面的 glob)
代码示例——列出当前目录所有 txt 文件
import os, fnmatch
for file in os.listdir(".") :
if fnmatch.fnmatch(file, "*.txt") :
print(file)
tempfile
【标准库】
使用它可以安全地生成临时文件或临时目录。
3.2 线程
threading
【标准库】
提供了比较高层的线程封装 API。它本身包含了线程同步/互斥的机制。
代码示例——基于"函数”的线程
import threading
import time
def my_thread() :
print("Thread started!")
time.sleep(3)
print("Thread finished!")
threading.Thread(target=my_thread).start()
代码示例——基于"类”的线程
import threading
import time
from future import print_function
class MyThread(threading.Thread) :
def run(self) :
print("{} started!".format(self.getName()))
time.sleep(3)
print("{} finished!".format(self.getName()))
if name == "main" :
for n in range(10) :
mythread = MyThread(name = "Thread-{}".format(n + 1))
mythread.start()
time.sleep(1)
3.3 进程
subprocess
【标准库】
用于进程管理,可以启动子进程,通过标准输入输出跟子进程交互。
代码示例——启动命令行进程,并获取该进程的标准输出
import subprocess
output = subprocess.check_output(["dir"]) # 获取当前目录的内容
output = subprocess.check_output(["netstat", "-an"]) # 获取当前网络链接
multiprocessing
【标准库】
它是 2.6 版本加入到标准库的,其 API 接口的风格类似于 threading 模块。
它本身包含了进程同步/互斥的机制。
代码示例——利用其 Lock 机制,确保多个子进程的标准输出不会混杂(每次只有一个进程调用 print)。
from multiprocessing import Process, Lock
def f(lock, n) :
lock.acquire()
print("hello world %d" % n)
lock.release()
if name == "main" :
lock = Lock()
for num in range(10):
Process(target=f, args=(lock, num)).start()
sh
Home:https://github.com/amoffat/sh
这个项目可以用来取代标准库中的 subprocess;同时兼容 Python2 和 Python3。
使用它可以写出比 subprocess 更简洁、更优雅的代码。
代码示例——获取命令输出
from sh import ifconfig
print(ifconfig("wlan0"))
代码示例——命令行参数
from sh import curl
传统风格
curl("https://program-think.blogspot.com/", "-o", "test.html", "--silent")
命名参数风格
curl("https://program-think.blogspot.com/", o="test.html", silent=True)
代码示例——管道
from sh import ls, wc
print(wc(ls("/etc", "-1"), "-l"))
3.4 本地进程间通信(IPC)
mmap
【标准库】
提供了内存映射文件的支持。
代码示例——利用 mmap 在父子进程间交换数据
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()
signal
【标准库】
用于进程信号处理的标准库(主要用于 Linux & UNIX 系统)。
顾名思义,这个库让你可以进行各种键盘相关的操作,包括:模拟按键、键盘钩子(hook),按键记录及重放。
支持复杂的组合键。纯 python 代码代码,同时支持 Windows 和 Linux。
代码示例
import keyboard
模拟按键。
keyboard.press_and_release("shift+s, space")
模拟按键,并执行相应代码。
keyboard.add_hotkey("page up, page down", lambda: keyboard.write("xxxx"))
等待特定按键,然后继续执行。
keyboard.wait("esc")
记录按键,直到用户按了 ESC;然后以3倍速重放刚才记录的按键。
recorded = keyboard.record(until="esc")
keyboard.play(recorded, speed_factor=3)
3.6 获取系统信息
sys
【标准库】
这个模块可供访问由解释器使用或维护的变量和与解释器进行交互的函数。
代码示例
sys.argv # 命令行参数 List,第一个元素是程序本身路径
sys.exit(0) # 退出程序,正常退出时用 0 表示退出码
sys.version # 获取 Python 解释程序的版本信息
platform
【标准库】
这个模块提供了很多用于获取操作系统的信息的功能。
代码示例
import platform
platform.platform() # 获取操作系统名称及版本号,例如:"Windows-7-6.1.7601-SP1"
platform.version() # 获取操作系统版本号,例如:"6.1.7601"
platform.architecture() # 获取操作系统的架构,例如:("32bit", "WindowsPE")
psutil
Home:https://github.com/giampaolo/psutil
psutil(Python system and process utilities)是一个跨平台的进程管理和系统工具库,可以处理”CPU、内存、磁盘、网络、用户"等信息。
主要用于系统资源的监控,分析,以及对进程进行一定的管理。
代码示例
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() # 启动进程的命令行参数
3.7 Linux & Unix 系统相关
syslog
【标准库】
通过它可以很方便地跟 POSIX 的 syslog 服务进行交互。
这个第三方库封装了 Windows API 及 COM API。通过它可以方便地用 Python 进行 Windows 编程(调用 COM 组件、编写 Windows 服务、等)。
PyInstaller 可以把你的 Python 代码制作成独立运行的程序(不依赖 Python 环境就可以运行)。
该工具支持多种操作系统,包括:Windows、Linux、Mac OS X、Solaris、AIX、等。
Links:Wikipedia
py2exe 的功能类似 PyInstaller,但只支持 Windows 平台。
它很类似于 py2exe,差别在于 py2exe 支持 Windows 平台,而 py2app 支持 Mac OS X 平台。
这套工具可以帮助你进行第三方库的管理(下载、编译、安装、升级、卸载)
4 Web
4.1 HTTP Client
httplib & httplib2 & http.request & urllib.parse
【标准库】
这几个库可以进行各种 HTTP 客户端请求(GET、POST、等)。
Python2 的模块名是 httplib 和 httplib2;到 Python3,模块名改为 http.request 和 urllib.parse
代码示例——读取指定 URL 的网页内容
import urllib
handle = urllib.urlopen("http://www.google.com")
page = handle.read()
handle.close()
Requests
Home:http://www.python-requests.org/
这是一个用起来很优雅的库,如其名,封装了 HTTP 请求的功能。
代码示例
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, ...}
4.2 HTTP Server
SimpleHTTPServer & http.server
【标准库】
提供轻量级 HTTP Server 的标准库。
Python2 的模块名叫 SimpleHTTPServer;到 Python3 模块名改为 http.server
代码示例——一个极简单的 HTTP 服务
import SocketServer
import SimpleHTTPServer
PORT = 8080
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print("serving at port %d" % PORT)
httpd.serve_forever()
4.3 Web 开发框架
(Python 的 Web 框架数不胜数,俺只挑选几个代表性的)
Links:Wikipedia 维基百科
在 Python 社区,Django 是目前最有影响力的 Web 开发框架。该框架很重型,内置了 Web 服务端开发常用的组件(比如:ORM、用户管理)。
Django 应用范围很广,比如 Google 的 Web 开发平台 GAE 就支持它。
而且它完全支持前面提到的 Jython 运行环境,可以运行在任何 J2EE 服务器上。
Links:Wikipedia 维基百科
又一个重型的 Web 开发框架,名气仅次于 Django。
它跟 Django 一样,都是"Full-Stack Frameworks”。
Links:Wikipedia
轻量级的 Web 框架。某些 Web 框架(比如前面提到的 TurboGears)使用它作为底层。
代码示例——Hello world
import cherrypy
class HelloWorld(object) :
def index(self) :
return "Hello World!"
index.exposed = True
cherrypy.quickstart(HelloWorld())
web.py
Home:http://webpy.org/
与前两个(Django、TurboGears)不同,这是一个轻量级的框架。甚至被称为"It's the anti-framework framework.”
其作者是大名鼎鼎的黑客 Aaron Swartz。(俺在某篇博文中悼念过他)。
当年 Aaron Swartz 用 web.py 来搭建同样大名鼎鼎的网站 reddit(该网站是 Web 2.0 的标杆)。
代码示例——Hello world
import web
urls = (
"/", "index"
)
class index :
def GET(self) :
return "Hello, world!"
if name == "main" :
app = web.application(urls, globals())
app.run()
Flask
Home:http://flask.pocoo.org/
Links:维基百科
轻量级 Web 应用框架。基于 Werkzeug WSGI 工具箱和 Jinja2 模板引擎。
代码示例——Hello world
from flask import Flask
app = Flask(name)
app.route("/")
def hello_world() :
return "Hello World!"
if name == "main" :
app.run()
Tornado
Home:http://www.tornadoweb.org/
Links:维基百科
同样也是轻量级的 Web 框架,类似 Web.py。提供异步非阻塞 IO 的处理方式使其拥有较为出色的抗负载能力。
4.4 Web前端 & JS整合
Pyjamas & pyjs
Home:http://pyjs.org/
这是从 GWT(Google Web Toolkit)移植的第三方库。提供了 Python 到 JS 的编译,AJAX 框架等功能。
Pyjamas 甚至能用来开发桌面 GUI 应用。
这也是一个 Python 到 JavaScript 的编译工具。
4.5 浏览器整合
webbrowser
【标准库】
操纵当前系统的默认浏览器,访问指定 URL 的页面。
代码示例——用默认浏览器打开 Google 主页
v8 是 Google 开发的 JavaScript 解释引擎。这是对 v8 引擎的 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() 函数
PyWebKitGtk
Home:https://github.com/jmalonzo/pywebkitgtk
WebKitGtk 是一个基于 WebKit 的 Web 渲染引擎。
PyWebKitGtk 则提供了对 WebKitGtk 的 Python 封装。
4.6 WebSocket
(关于 WebSocket 的介绍,可以参见维基百科的"这个链接”)
这是 Google 提供的 WebSocket【服务端】。
该项目包含一个可独立运行的 server 以及一个 Apache 扩展模块(mod_pywebsocket)。
这是 Autobahn 项目的子项目,同时提供了 WebSocket 的"服务端 & 客户端”。
它兼容 Python2 和 Python3,另外还兼容 PyPy 和 Jython。
网络方面,它可以跟"asyncio 标准库”以及"Twisted”整合。
除了实现 WebSocket 协议,它还完整实现了 WAMP(Web Application Messaging Protocol)。
代码示例——Echo Server
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))
此项目同时提供了 WebSocket 的"服务端 & 客户端”;并同时兼容 Python2 和 Python3。
其【服务端】可以跟"CherryPy、gevent、wsgiref、asyncio”整合;其【客户端】可以跟"Tornado、gevent”整合。
selenium 是一个非常优秀的框架,用于爬虫和 Web 自动化测试。
代码示例——模拟登录
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()
scrapy
Home:https://scrapy.org/
Links:Wikipedia
Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。
可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
Links:Wikipedia
这是一个底层的网络库,可以在不同协议层次构造网络数据包(包括链路层、网络层、传输层),还支持 Sniffer 抓包。
搞网络安全的网友应该会喜欢这个库。
代码示例
传统的 ping 扫描(网络层)
ans,unans = sr(IP(dst="192.168.1.1-254")/ICMP())
局域网内的 ARP 扫描(链路层)
ans,unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.0/24"), timeout=2)
5.2 传输层
socket
Python 标准库很早就提供了对 socket 编程的支持。
这个标准库是对伯克利套接字进行简单的封装,其 API 基本上跟 BSD SOCKET 一一对应。
asyncore
这个标准库提供了异步 SOCKET 的支持。
asynchat
这个标准库基于上述的 asyncore,提供更高层的 API,简化异步通讯编程。
5.3 标准的应用层
5.3.1 综合性的库
PycURL
Home:http://pycurl.sourceforge.net/
cURL 是一个功能很强的网络库/网络工具,支持 N 多应用层协议。俺在前几年写过一篇博文推荐它(在"这里”)。
看名称就能猜到——PycURL 是 cURL 的 Python 封装。
代码示例——发起 HTTP GET 请求
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()
5.3.2 HTTP
(关于"HTTP 协议”,请参见另一个大类:"Web”)
5.3.3 文件传输
ftplib
【标准库】
封装 FTP(File Transfer Protocol)协议
代码示例——列出 FTP 服务器上某目录的内容
from ftplib import FTP
ftp = FTP("ftp.debian.org") # 连接服务器(如果不指定端口号,则用默认端口号 21)
ftp.login() # 登录(如果不指定用户名和密码,则用匿名登录)
ftp.cwd("debian") # 切换到 "debian" 目录
ftp.retrlines("LIST") # 列出当前目录的内容
ftp.quit()
pysftp
Home:https://bitbucket.org/dundeemt/pysftp
封装 SFTP 协议,依赖于 ssh.py
代码示例——简单的上传/下载
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") # 递归复制某个服务端的目录到本地
5.3.4 电子邮件
smtplib
【标准库】
封装 SMTP(Simple Mail Transfer Protocol)协议
imaplib
【标准库】
封装 IMAP(Internet Message Access Protocol)协议
poplib
【标准库】
封装 POP3(Post Office Protocol v3)协议
一个非常简单易用的用来发送邮件的第三方库。
代码示例
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("[email protected]", "subject", contents)
5.3.5 即时通讯
jabber.py
Home:http://jabberpy.sourceforge.net/
Jabber(又称 XMPP)是IM(即时通信)协议的标准。这是用 Python 封装的第三方库。
IRC 是 Internet Relay Chat 的缩写。这是用 Python 封装的第三方库。
一个简单、易用的 TelegramBot 封装。
纯 Python3 的 Telegram 客户端封装。
5.3.6 远程控制
telnetlib
【标准库】
封装 telnet 协议
代码示例——使用 telnet 登录到某个主机并执行简单命令
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 + " ")
if password :
tn.read_until("Password: ")
tn.write(password + " ")
tn.write("ls ")
tn.write("exit ")
纯 Python 实现的 RDP(微软远程桌面协议)和 VNC(Virtual Network Computing)客户端,依赖于 Twisted 库
paramiko 是用 python 语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。
除了 SSH 协议之外,paramiko 还支持SFTP。
代码示例
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("IP", port, "username", "password")
5.3.7 (其它)
urlparse
【标准库】
用于解析 URL,提取各个部分的内容。从 Python 2.5 版本开始加入到标准库中,从 Python 2.7 开始支持包含 IPv6 的 URL
Links:Wikipedia
这是 Google 开发的一个跨语言的库,用于网络传输业务数据时的"编码/解码”。
其优点是:跨多种语言、高性能、向前兼容、向后兼容。俺前几年写过一篇博文推荐 protobuf(在"这里”)。
作为 Protocol Buffers 的发明者,Google 默认实现了三种编程语言(C++、Java、Python)对它的支持。
Links:Wikipedia
来自于 Apache 社区,提供了一种跨语言的通讯机制。
程序员通过 Thrift 的"接口定义语言”定义通讯协议格式,然后 Thrift 根据协议格式自动帮你生成服务端和客户端代码。
(在这个方面,它有点类似于 Google 的 Protocol Buffers)
5.5 网络库、框架、中间件
Twisted
Home:http://twistedmatrix.com/
Links:Wikipedia
这是一个基于 Python 网络通讯开发框架,诞生于2002年,名气很大。
它的某些设计类似于 C++ 的 ACE 框架。除了能用来进行传输层(TCP UDP)的开发,还提供了若干应用层协议(HTTP、XMPP、SSH、IRC ...)的支持。
代码示例——实现一个简单的 Echo 服务,监听在 12345 端口
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()
gevent
Home:http://www.gevent.org/
这是一个基于协程的网络库,原先其底层依赖于 libevent,后来改为 libev。
很多开源项目用到了 gevent,具体参见 gevent 官方的 wiki。
代码示例——并发执行网络请求
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])
PyZMQ
Home:https://github.com/zeromq/pyzmq
这是 ZMQ(ZeroMQ)的 Python 封装库。同时支持 Python2 和 Python3。
PyZMQ 2.2 之后的版本同时支持 ZMQ 的 3.x 和 4.x 版本。
这是 nanomsg 的 Python 封装库。同时支持 Python2 和 Python3。
代码示例——Hello world
from future 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()
5.6 云计算
Apache Libcloud
Home:https://libcloud.apache.org/
如今云提供商越来越多。这个库提供了统一的 API 让你访问各大知名云提供商提供的各种服务。
代码示例——创建 DNS 记录
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)
6 数据库
为了便于数据库开发,Python 社区制定了数据库的 API 规范(PEP 249)。
只要是涉及到数据库操作,标准库和大部分第三方库都会遵循该规范(请看如下几个模块的示例代码)。
pyODBC 封装了 ODBC API,通过它可以访问各种数据库(只要有 ODBC 驱动即可)。
代码示例——查询某个 ODBC 数据源的某个表
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()
ceODBC
Home:http://ceodbc.sourceforge.net/
又一个封装 ODBC API 的第三方库
6.1.2 JDBC
Jython
Jython 前面已经介绍过。有了它,你可以基于 JDBC 操作数据库。
6.1.3 ADO & ADO.NET
PyWin32
PyWin32 前面已经介绍过。有了它,你可以基于 ADO 操作数据库。
IronPython
IronPython 前面已经介绍过。有了它,你可以基于 ADO.NET 操作数据库。
6.2 特定数据库
6.2.1 MySQL
MySQL for Python
Home:http://mysql-python.sourceforge.net/
操作 MySQL 的第三方库。
代码示例——查询某个 MySQL 数据库的某个表
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()
6.2.2 PostgreSQL
psycopg
Home:http://initd.org/psycopg/
操作 PostgreSQL 的第三方库。
操作 PostgreSQL 的第三方库。
操作 Oracle 的第三方库。
6.2.4 MS SQL Server
pymssql
Home:http://pymssql.org/
操作微软 SQL Server 的第三方库。
操作 DB2 的第三方库。
6.2.6 SQLite
sqlite3
【标准库】
sqlite3 从 Python 2.5 版本开始加入到标准库中。通过它,你可以很方便地操作 SQLite 数据库。
SQLite 是一个很优秀的轻量级数据库,俺前几年写过一篇博文推荐它(在"这里”)。
代码示例——创建一个内存数据库,建表并插入记录
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()
6.2.7 MongoDB
PyMongo
Docs:https://docs.mongodb.com/ecosystem/drivers/python/
这是 MongoDB 官方提供的 Python 驱动。
操作 HBase 的 Python 库,基于 Thrift 连接到 HBase。
代码示例——简单的存取操作
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"])
6.2.9 Redis
redis-py
Home:https://github.com/andymccurdy/redis-py
操作 Redis 的第三方 Python 客户端。
代码示例——简单的存取操作
import redis
r = redis.StrictRedis(host="localhost", port=6379, db=0)
r.set("foo", "bar")
print(r.get("foo"))
6.2.10 LevelDB
Plyvel
Home:https://github.com/wbolster/plyvel
操作 LevelDB 的 Python 库,速度快,同时兼容 Python2 和 Python3。
代码示例——简单的存取操作
import plyvel
db = plyvel.DB("/tmp/testdb/", create_if_missing=True)
db.put(b"key", b"value")
print(db.get(b"key"))
db.close()
6.2.11 Berkeley DB
PyBSDDB
Home:http://www.jcea.es/programacion/pybsddb.htm
操作 Berkeley DB 的第三方库。
6.3 ORM(Object-Relational Mapping)
SQLAlchemy
Home:http://www.sqlalchemy.org/
Links:Wikipedia 维基百科
SQLAlchemy 支持的数据库有:MySQL、PostgreSQL、Sqlite、Oracle、MS SQL Server、Firebird、Sybase SQL Server、Informix、等。
代码示例——通过对象的方式创建两张依赖关系的表
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relation, sessionmaker
Base = declarative_base()
class Movie(Base) :
tablename = "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 __init__(self, title=None, year=None) :
self.title = title
self.year = year
def __repr__(self) :
return "Movie(%r, %r, %r)" % (self.title, self.year, self.director)
class Director(Base) :
tablename = "directors"
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False, unique=True)
def __init__(self, name=None) :
self.name = name
def __repr__(self) :
return "Director(%r)" % (self.name)
Base.metadata.create_all(create_engine("dbms://user:pwd@host/dbname"))
SQLObject
Home:http://sqlobject.org/
Links:Wikipedia
SQLObject 支持的数据库有:MySQL、PostgreSQL、Sqlite、MS SQL Server、Firebird、Sybase SQL Server、SAP DB、等。
代码示例——通过对象的方式创建表
from sqlobject import *
sqlhub.processConnection = connectionForURI("sqlite:/:memory:")
class Person(SQLObject) :
first_name = StringCol()
last_name = StringCol()
Person.createTable()
Peewee
Home:http://www.peewee-orm.com/
一个轻量级的 ORM,支持 SQLite、MySQL 和 PostgreSQL,通过插件机制支持更多数据库。
同时支持 Python2 和 Python3。
代码示例——通过对象的方式创建表
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])
7 GUI
7.1 GUI 框架
7.1.1 基于 Tk
Tk 是一个跨平台的界面组件库。
Tkinter & tkinter
【标准库】
这是 Python 内置的标准库,封装了 Tcl/Tk 界面库。
Python2 的模块名叫 Tkinter,到 Python3 模块名改为 tkinter
代码示例——用 Tkinter 写 Hello world
from Tkinter import *
if name == "main" :
root = Tk()
label = Label(root, text="Hello, world")
label.pack()
root.mainloop()
7.1.2 基于 wxWidgets
wxWidgets 是 C++ 开发的跨平台框架(不仅包括 GUI,还有其它功能)。
Links:Wikipedia 维基百科
在所有的 wxWidgets 的 Python 封装库中,这个是名气最大的。
Ulipad(知名的国产的 Python IDE)就是基于 wxPython 开发的。
代码示例——用 wxPython 写 Hello world
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 name == "main" :
app = App()
app.MainLoop()
PythonCard
Home:http://pythoncard.sourceforge.net/
又一个基于 wxWidgets 的 GUI 库。
7.1.3 基于 GTK+
GTK+ 全称是(GIMP Toolkit),由 C 开发的跨平台界面组件库。
Links:Wikipedia
它是 Python 对 GTK+2 的封装。
代码示例——用 PyGTK 写 Hello world
import pygtk
pygtk.require("2.0")
import gtk
class HelloWorld :
def init(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 name == "main" :
hello = HelloWorld()
hello.main()
PyGObject(PyGI)
Home:https://live.gnome.org/PyGObject
它是 Python 对 GTK+3 的封装。PyGTK 的官网也推荐它。
代码示例——用 PyGObject 写 Hello world
from gi.repository import Gtk
class MyWindow(Gtk.Window):
def init(self):
Gtk.Window.init(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()
7.1.4 基于 Qt
Qt 是 C++ 开发的跨平台框架(不仅包括 GUI,还有其它功能)。
Links:Wikipedia 维基百科
这是 Python 对 Qt 的封装。
代码示例——用 pyQt 写 Hello world
import sys
from PyQt4.QtGui import *
if name == "main" :
app = QApplication(sys.argv)
window = QWidget()
window.resize(320, 240)
window.setWindowTitle("Hello, world")
window.show()
sys.exit(app.e