(重定向自 Develop.Python)

On this page... (hide)

  1.   1.  基本安装
  2.   2.  Python文档
    1.   2.1  推荐资源站点
    2.   2.2  其他参考资料
    3.   2.3  代码示例
  3.   3.  常用工具
    1.   3.1  环境管理
    2.   3.2  Python IDE
    3.   3.3  有意思的东西
    4.   3.4  普通但没准有用的东西
  4.   4.  内置类库使用参考
  5.   5.  常用第三方类库
    1.   5.1  跨语言调用
    2.   5.2  高并发架构
    3.   5.3  网络抓取
    4.   5.4  网页解析
    5.   5.5  多语言支持
    6.   5.6  网络服务
    7.   5.7  协议封装
    8.   5.8  数据存储
    9.   5.9  科学计算与数据挖掘
    10.   5.10  并行计算
    11.   5.11  分布式任务队列
    12.   5.12  图像处理
    13.   5.13  游戏开发
    14.   5.14  系统工具
    15.   5.15  服务管理
    16.   5.16  图形界面
    17.   5.17  程序调试
    18.   5.18  性能调优
    19.   5.19  检查与测试
    20.   5.20  程序发布
    21.   5.21  移动终端支持
    22.   5.22  Excel 读写

1.  基本安装

2.  Python文档

学习资料:

编码风格:

培训素材:

训练题:

其他:

2.1  推荐资源站点

2.2  其他参考资料

具体技巧:

Web 框架:

  • Pythonic Web 应用平台对比 现在个人对TurboGears 2Pylons web.py(大致和KARRIGELL类似,都是类似于PHP那样比较简单的Python Web应用框架)和web2py 非常感兴趣。近来Zope社区又出现了repoze.bfg这个解决方案,于是做应用时可以自由选用Zope中的合适部分了( Zope 社区的另一个发展方向是Grok,目标是敏捷易用又强大)。轻量级的除原来的web.py之外又有了Flask等等实现。另外还有Paste这样的 WSGI 参考实现来帮助做自己的框架,比如Bottle就是一个基于 WSGI 的 Web 开发框架。
    • My Exit from Zope:Grok 和 Five 的作者 Martijn Faassen 写的 Zope 系列故事。社区有句名言——Web 开发发生的一切都在 Zope 身上发生过。那么了解 Zope ,就是在了解 Web 开发的历史。
  • TurboGears2 要点笔记
  • Flask 要点笔记

Web 应用部署:

  • 近年来比较流行的部署组合似乎是 Nginx + Gunicorn + Gevent + umysqldb 。比 fcgi 快,比 uWSGI 灵活。

并发处理:

图形界面:

工具配置:

2.3  代码示例

  • http://newedit.tigris.org/technical.htm Limodou的NewEdit编辑器的技术手册,讨论了一些关于插件接口实现、i18实现、wxPython使用有关的问题,值得参考。
  • 关于插件扩展机制:
    • A Simple Plugin Framework 讲解了一种非常聪明而简单的办法来为代码提供插件接口。如果参考Java社区的类似框架,则有Java Plug-in Framework (JPF)以及OSGi标准。
    • 另外limodou先生在Ulipad中实现插件和MixIn的机制也十分简单有效,见[NewEdit]设计说明(一)--概述,当然在UliPad最新版本的代码中对这个机制的实现又有实用的改进。(发布插件则有不少项目采用Python Eggs
    • 比较复杂的应用程序则可以使用Zope Component Architecture这样的机制来实现灵活易用的扩展接口(注意:zca虽然是Zope平台的一个组成部分,但其自身是不需要依赖Zope平台即可使用的)。

3.  常用工具

  • Python Sidebar for Mozilla FireFox的一个插件,提供一个用来查看Python文档、函数库的侧边栏。
  • IPython 很好用的Python Shell。
  • Fabric:Fabric 是一个自动化工具,它可以完成任意可以由脚本完成的事情,非常适合在本地操作远程——你不需要一次又一次的SSH到远程再进行部署。
    • http://www.scons.org/ Java有Ant这个巨火的构建工具,Python的特性允许我们构建更新类型的构建工具,就是scons了。

3.1  环境管理

环境隔离:

  • virtualenv:偶尔软件项目的模块依赖比较复杂,极少数情况下还会挑模块版本。所以通常建议在开发和线上部署的时候先用 virtualenv 建一个独立的环境,就可以避免不同项目之间的依赖模块相互影响了。
    • 建立新 virtualenv 环境的时候可以加 --system-site-packages 参数,这样建立出来的环境就能默认调用系统中已有的全局模块,在使用只能通过编译安装而且有大量编译依赖的库的时候比较有用(比如 MySQL)。
    • OSX 下的 virtualenv 环境默认无法与图形界面交互(比如会导致 Matplotlib 显示不出图像来),其中一种绕过方法是建立一个 PATHTOVENV/bin/frameworkpython 文件,用这个脚本来代替标准的 python 执行指令就可以了,其文件内容为:(也有其他的处理办法,参考 Working with Matplotlib on OSX
      #!/bin/bash

      # what real Python executable to use
      PYVER=2.7
      PATHTOPYTHON=/usr/local/bin/
      PYTHON=${PATHTOPYTHON}python${PYVER}

      # find the root of the virtualenv, it should be the parent of the dir this script is in
      ENV=`$PYTHON -c "import os; print(os.path.abspath(os.path.join(os.path.dirname(\"$0\"), '..')))"`

      # now run Python with the virtualenv set as Python's HOME
      export PYTHONHOME=$ENV
      exec $PYTHON "$@"
      • 如果 Matplotlib 库工作不太正常,可以建立一个 simple_plot.py 文件,其内容为:
         
        import matplotlib.pyplot as plt
        fig, ax = plt.subplots()
        ax.plot([1,2,3])
        plt.show()
        并执行以下指令来检查环境状态:
         python simple_plot.py --verbose-helpful

软件包管理:

  • pip:在包依赖处理等方面比 easy_install 更好的一个解决方案,现在已经成为 Python 生态的主流方案了。
    • 如果在国内下载太慢,可以设置为使用清华的 PyPI 镜像,设置方法见:PyPI 镜像使用帮助
    • 可以通过 pip install -h 指令,看它在 --index-url 参数的说明文字里显示的仓库地址来检查当前仓库设置。
  • Easy Install:快速安装Python模块的易用性解决方案(使用这种方式发行的包通常以 Python Eggs 的格式被Easy Install自动处理)。
  • Yolk:包信息管理工具,可以把已经安装的包的版本列出来。
  • Mac下说setuptools版本过低的问题

3.2  Python IDE

我的IDE选择经验 其实最强大易用的现在是 PyCharm;自己装插件、改配置的话可以选 VS Code 或 Sublime Text。数据研究一般选 Jupyter Lab。当然用 Vim 之类总归永远是可以的。

  • Pydev 基于Eclipse的,非常棒的Python环境,改进速度非常快,现在是我最喜欢的IDE。
  • ulipad Python+wxPython实现的轻量级全功能跨平台IDE,非常好用。做一些简单小东西的时候我会用这个。
  • Eric Python IDE 基于QT实现的非常不错的跨平台PYTHON IDE。支持调试,支持自动补全,甚至也支持重构。如果没有ulipad,并且在我的gnome下基于QT的Eric界面别走形的话,我会选这个。
    • Spyder 几乎是个轻量化的 Eric ,也是基于 QT 和 QScintilla2 实现。它是科学计算包 python(x,y) (集成了科学计算常用的python第三方库,有400多M)的一个组成部分。
    • http://www.scintilla.org/ 同时支持Win和Linux的源代码编辑器,似乎支持Python文件的编辑。
  • http://boa-constructor.sourceforge.net/ 著名的基于WxPython的GUI快速生成用的Python IDE,但是开发进度实在太不积极了……

3.3  有意思的东西

  • Cowsay:著名 Linux 命令行程序 cowsay 的 Python 移植。大致功能是生成一个动物说话的字符画,过去被广泛用在 IRC 类的网络环境里。
  • Pyodide:在浏览器中运行的 Python 命令行终端。而且这个方案还移植了大量第三方类库的包。
  • Howie:用Python实现的MSN对话机器人。
  • Cankiri:用一个Python脚本实现的屏幕录像机。

3.4  普通但没准有用的东西

  • pyForum:纯Python实现的论坛程序中最接近实用程度的一个,基于web2py实现。

4.  内置类库使用参考

5.  常用第三方类库

5.1  跨语言调用

  • JPype Python里调用Java类库、Java代码的桥接解决方案(因Limodou在ChinaUnix上提及而得知)。JPype使用要点 和其他语言调用 JNI 接口的方案一样,JPype 也常有内存泄露。
  • ctype 和 CFFI 都是在 Python 里头调 C 函数库的方案,不过使用风格不太一样。

5.2  高并发架构

  • PEAK提供一些用于实现自动化集群测试的重要基础类库,比如超轻量线程框架、分布式代码执行等。
    • greenlet 是PEAK给出的一种进程内的线程模型实现,自称是Stackless项目的副产品。其实这是一种伪线程,也就是说greenlet间切换需要明确指定下一步切换到哪块指令继续执行,而没有被执行的代码就被暂时挂起了。这里面greenlet间的执行顺序是完全确定的,并且是非并发的,就不能解决长时间大量资源占用的操作会导致程序无响应的问题。但greenlet可以用来减少资源死锁、互斥造成的资源消耗(代码被阻塞时,可以切换先去执行其他未被阻塞的部分),因此用来响应按钮点击等是挺好用的。
      • greenlet 现在不再是 pylib 的组成部分了,而是一个独立的名为 greenlet 的 pypi 包,可以通过 easy_install 安装。
    • Eventlet 是基于 greenlet 完成的一个高并发网络库,提供“线程”池、消息队列等许多非常方便的机制,比直接用 greenlet 要方便得多。并且 Eventlet 源自著名的虚拟现实项目——第二人生,是经过现实考验的可靠解决方案。

5.3  网络抓取

  • Requests:HTTP 协议访问封装库,接口界面设计比 Python 自带的 urllib 之类要简洁方便无数~
    • requests 库有个坑,它的 get 、 post 等请求默认的 timeout 参数都是 None,表示当服务器关闭连接时才超时,有可能导致程序卡死,因此建议使用时每次都单独设置明确的 timeout 取值。
  • PycURL 传说这是实现Python下多线程网页抓取的效率最高的解决方案,本质是对libcurl C语言库的封装。其实Twisted也可以定制成为一个网页抓取工具的。
  • Scrapy 是一个网络爬虫框架,可以非常容易地通过定制规则得到所需的爬网器。基于 Twisted 实现。
    • Larbin:似乎是 C++ 语言实现的一个多用途爬虫,号称性能很强,但目前不确定是否有 Python 封装。
  • Python 可以通过 pamie 控制 IE 浏览器,通过 jssh 控制 Firefox ,主要目的是能比较完善地处理 Javascript 等。
    • Spynner:操控一个无 GUI 的 Webkit 实现 http 访问的模块。因为依靠 Webkit ,所以它能提供 AJAX 支持~
    • PhantomJS:同样是个无界面 Webkit ,只不过提供的 API 不是 Python 的,而是 Javascript 的。
    • Zombie.js:也可以作为无头浏览器使用,但无需浏览器进程支持,而是依赖 Node.js ,接口也就自然是 Javascript 的。
    • 更多关于操作无界面浏览器后端的讨论参考 Headless Browser for Python (Javascript support REQUIRED!)
  • twill:Web 访问的自动化工具,有命令行界面和 Python API 。可以填写表单、支持 cookies 等,因此可以用作 Web 的自动化测试工具。
    • mechanize是一个与之类似的东西,不过似乎使用起来比 twill 复杂一些,并且即使是这东西也仍然不支持 Javascript 的执行。
  • pyv8:这是 Google V8 Javascript 引擎的 Python 封装,也就是说可以利用这个桥接器在 Python 里头运行 Javascript 代码。

5.4  网页解析

  • chardet 一个猜测网页编码(比如utf-8还是gb18030)的库,会根据HTTP参数、HTML标签、XML标签中的相关声明来进行猜测。另有一个非Python实现的Enca也可以提供类似的功能。
  • µTidylib 著名html整理、排错、自动修正工具HTML Tidy Library的Python封装。通常在正式开始分析html之前,先用这个东西预处理一下,后面的工作会轻松、准确得多~
  • pyquery:在 Python 中以 jquery 风格书写代码来解析网页架构,比较符合前端的常见工作习惯。

5.5  多语言支持

  • Python for CJK 提供与python有关的CJK语言支持功能:转码、显示之类。

5.6  网络服务

  • Tornado 非阻塞、高性能、可扩展的 Web Server 实现,源自FriendFeed
  • Scapy:似乎是一个能够控制底层网络封包的交互式Python工具,对网络协议分析应该很有用。
  • Socket.io 是 Web 上实时消息传输的可靠解决方案。用它来做聊天室之类的应用体验能够接近桌面软件。Python 在服务器端对这个协议的实现有以下几种方案:

代理调用:

  • socksipy-branch:socks4/socks5 代理调用的封装库,支持 socket、urlib2、ftplib、telnetlib 等等这些模块的无缝调用。

5.7  协议封装

  • Crypto python的加解密扩展模块;
    • 另外还有 Google 发起的 Keyczar 加密库项目。
  • simpleapi:特别简单好用的用来生成 json 等格式网络服务的一个框架,支持与 Flask 、 Django 等集成。
  • Protocol Buffers Google提供的高效数据序列化解决方案,比基于XML的数据序列化方案在数据大小和编解码效率上都大约高一个数量级。当然,Google自己也说这种办法也不是用哪都合适,一来Protocol Buffers不大适合用来处理格式化的文本,另一方面其本质是一个传输协议的生成语言,可能在传输的内容相对固定时,才值得专门生成一套这样的解析器。
    • Thrift:Facebook 开源出来的一个类似解决方案,优点是能支持更多平台和更多语言,形成一个更通用的二进制网络服务接口。豆瓣在逐步转向服务化,据称大量使用了 Thrift ,并利用Paste Script简化 Thrift 的使用、管理和部署。
  • pyzmq:消息队列 zerozmq 的 Python 封装,基本上这是一个追求性能为主的消息队列实现,全部数据在内存中保存。如果担心数据持久化的问题,可以考虑 RabbitMQ 等类似方案。另据传闻,Twitter已经由RabbitMQ转换到Kestrel
  • Mulib 和 restish 都是基于 Python 实现的 REST 风格网络服务框架。

5.8  数据存储

  • 嵌入式数据库:BerkeleyDB的Python版,当然还有其他的好多。
    • RocksDB:Key/Value 风格的嵌入式数据库的最高峰,可以作为各种数据管理系统的底层存储部分,比如 MySQL 就有基于 RocksDB 的实现版本。
    • 如果需要 SQL 能力,面向数据管理的话,一般是用 Sqlite;面向数据分析的话,一般使用 DuckDB(因为底层是基于列存储引擎,而且支持压缩);
  • Pyro 一个Python的分布式对象系统,提供面向对象风格的RPC功能。
  • Durus:Python的对象数据库,当然也可以作为一种对象实例持久化的机制来使用;这是一个开源的纯Python实现,并提供一个可选的C语言插件来大幅提高运行效率。
    • Missile DB:一种 Python 的、简洁高效的 DBMS,自称是Durus的一种衍生品,更能够适应Stackless Python环境。同时也是并发性能极高的Eurasia3项目的一个子项目。
  • ey-lessql:收集的各种分布式键值数据库的Python版驱动。如果不考虑Python驱动的问题,A Yes for a NoSQL Taxonomy是一个非常完整的非SQL数据存储引擎列表。
    • NoSQL数据库探讨之一 - 为什么要用非关系数据库?
    • NOSQL Patterns
    • 目前我最感兴趣的键值数据库是MongoDB,有人认为它基本上已经可以替代MySQL所能提供的功能,并且性能更高!
      • Ming可能是类似 ORM 对关系数据库所起作用的 MongoDB 的 Python 封装?
      • pymodels MongoDB 的轻量级 ORM 封装,它本来是用于 Tokyo Tyrant 和 Tokyo Cabinet 的。
      • MongoEngine:Quora 上有人推荐说这个是 Django ORM 风格的 MongoDB Python 封装,可是其官网上怎么说这是一个 object-document mapper ?

5.9  科学计算与数据挖掘

  • NumPy:Python的数学运算库,有时候一些别的库也会调用里面的一些功能,比如数组什么的。
  • SimPy:利用Python进行仿真、模拟的解决方案。
  • Matplotlib:据说是一个用来绘制二维图形的Python模块,它克隆了许多Matlab中的函数, 用以帮助Python用户轻松获得高质量(达到出版水平)的二维图形。
    • Seaborn:在 Matplotlib 基础上进行了改进,更易用,生成的图表更美观。
    • Graphviz:与 Matplotlib 不同,这个东西能画:有向图、网络结构、有限状态机等等。本身不是 Python 实现的,但是能找到 Python 封装。

5.10  并行计算

  • Faust:流计算解决方案,可以用 Python 来定义流处理任务。
  • Dask:对 Pandas 风格的各种 DataFrame 操作自动拆解成并行计算任务来处理,这样有效利用多 CPU 甚至多主机来快速计算超大数据集。
  • pyre:使用Python完成高性能计算需求的包,真的可以做到么?还没研究。
  • Parallel Python:纯Python的并行计算解决方案。相关中文参考页面

5.11  分布式任务队列

  • Celery:可能是 Python 领域最著名的分布式任务队列解决方案了,简单易用又稳定,可以轻松帮助 Web 应用处理类似秒杀、资源排队这类复杂的多用户互斥情形。
  • Blinker:应该是一个分布式消息分发的解决方案。

5.12  图像处理

  • Pil:Python 下著名的图像处理库 Pil。
  • Tesseract:Python 的 OCR 解决方案,常被用于自动识别验证码。

5.13  游戏开发

  • pygame:用Python帮助开发游戏的库,也可以用这个来播放视频或者音频什么的,大概依靠的是SDL;pygame 的 2D 性能比较不错,硬件兼容性也比较好。
  • pyglet:这个背后依赖的是 OpenGL ,所以硬件兼容性不如 pygame 。但是在有强力显卡支持的情况下,3D 性能就要比 pygame 靠谱很多了。

5.14  系统工具

  • pyinotify 利用操作系统自身提供的Notify机制以最高的效率监控文件变化。
  • Pexpect:用Python作为外壳控制其他命令行程序的工具(比如Linux下标准的ftp、telnet程序什么的),还没有测试可用程度如何。

5.15  服务管理

  • daemonize:支持让 Python 代码在 Unix-like 系统上以 daemon 守护进程的方式工作。这样写出来的服务程序就更像一个真正的“服务”了~
  • Supervisor:用这个其实也能实现把一个普通进程封装成系统服务的功能。

5.16  图形界面

  • PySimpleGUI:极其简单易学的图形界面库,而且可以选择不同的底层后端,所以观感也可以弄到挺不错。我认为做软件时可以先拿这个试试看。
  • Tk:这个本来是 Python 默认自带的图形界面库,简单好用但是大家总觉得丑。
    • 其实加上它的外观扩展Tk Themed Widgets (ttk)会好看很多很多,这样既不损失任何 Tk 的特性,而且代码改动量也非常小。不过我在 OSX 下试验,ttk 弄出来的界面不支持中文输入法。。
  • Kivy:跨平台的解决方案,也能支持制作 iOS 和 Android 应用。
  • wxPython 基于wxWindows的易用且强大的图形界面开发包wxPython;wxPython发行版还自带了PyCrust、PyShell、PyAlaCarte和PyAlaMode等几个工具,分别是图形界面Shell和代码编辑器等,分别具有不同特点可以根据自己的需要选用。
  • PyQt 一般认为综合各平台上的表现,PyQt比wxPython能提供更为可靠的表现,较少遇到稀奇古怪的Bug。只是Qt虽然LGPL了,可是PyQt对商业软件仍然是收费的,Nokia刚开始做LGPL的Qt绑定——PySide,但是还谈不上成熟。
    • 在Mac上安装PyQt的详细步骤 PyQt在Win和Linux上都有可直接安装的二进制包,只有Mac没有。不过按照这篇文档来做,也是不难(我已试过,一切靠谱)。
  • PyGtk Qt永远的竞争者,在Win和Linux下表现都还不错,Mac下新的本地化移植绕过了系统自带的X11服务,性能大为提升,只是对输入法和字体支持等还有欠缺。
  • PyObjC:这个专用于 Mac OS X 平台,调用原生 Cocoa GUI 框架的。
  • Python bindings for Sciter:GUI 界面也可以不用原生的,而是基于 HTML5 来生成。Sciter 是其中一个比较成熟的解决方案,Norton 杀毒软件的界面就是用这个来实现的。
  • NiceGUI:同样是以 Web 作为界面,但对网页的编程细节封装得非常好,更像是在写 Python 代码。界面的体验观感也非常好。总体挺适合用来创建人工智能场景的使用界面的。
  • http://avc.inrim.it/html/ 比MVC模式更方便易用的开发框架,主要是帮助透明地完成界面控件与后台数据之间的内容绑定。该框架支持GTK、QT、TK、wxWidgets等主要具有Python封装的GUI开发框架。
  • TraitsUI:也是一个虚拟封装层,底层可以是 QT 或者 wx。经常作为数据分析应用的界面创建器。
  • Enaml:在 QT 基础上定义的界面描述语言,风格相当于于是 Python 语言的扩展。
  • pyjamas:Google GWT的Python克隆,还处在早期版本阶段。

5.17  程序调试

  • Loguru:标准库的 logging 用起来实在太麻烦了,Loguru 的易用性要好太多了,强烈推荐使用。

5.18  性能调优

  • Psyco、Pyrex:两个用于提高Python代码运行效率的解决方案;如果对性能还不满意,可以试试这样:用 Python 写自己的 C Module
  • Heapy 对 Python 程序进行内存占用剖析的模块,Guppy-PE 项目的组成部分之一,被 Scrapy 等项目用作内存泄露的调试工具。类似的还有:
    • PySizer,感觉已经太旧了。
    • Dowser,和 Heapy 特点不太一样,并且使用CheeryPy作为调试结果的输出界面。
  • Gluttony Python 模块之间依赖关系图的自动生成工具。

5.19  检查与测试

  • PyflakesPyCheckerPyLint:都是用来做Python代码语法检查的工具。
  • Fudge 被HD的项目组认为是最好的Python Mock模块(也即冒烟测试)。
  • nose 测试脚本自动发现、自动执行辅助工具。文档见nose documentation
  • Coverage.py Python 测试代码覆盖率统计工具,已经内置于 nose 。

5.20  程序发布

  • Nuitka:真正的二进制发布神器,不但支持整个程序打包,还可以单独加密某个模块,从而实现源代码保护。
  • PyInstaller:比 py2exe 更好用,而且支持 Win、Mac、Linux 三个平台。最新版本的易用性已经非常好了。
  • py2exe win下将Python程序编译为可执行程序的工具,是一个让程序脱离Python运行环境的办法,也可以生成Windows服务或者COM组件。其他能完成Python脚本到可执行文件这个工作的还有Gordon McMillan's Installer、Linux/Unix专用的freeze、Mac专用的py2app,另外setuptools可能也能帮上点。不过此类工具难免与一些模块有一些兼容性的问题,需要现用现测一下。总之这个主题可以参考How to Distribute Commercial Python Applications

5.21  移动终端支持

5.22  Excel 读写

GlossyBlue theme adapted by David Gilbert
Powered by PmWiki