Python學習

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。
  • Easy Install 快速安裝Python模塊的易用性解決方案(使用這種方式發行的包通常以Python Eggs的格式被Easy Install自動處理)。
    • 一般推薦先用 virtualenv 建個虛擬python環境再使用 easy_install (之後就不用加 --prefix參數了)(而且可以避免包與包之間相互影響)。
    • pip:在包依賴處理等方面比 easy_install 更好的一個解決方案。
    • Yolk:包信息管理工具,可以把已經安裝的包的版本列出來。
    • Mac下說setuptools版本過低的問題
  • Fabric:Fabric 是一個自動化工具,它可以完成任意可以由腳本完成的事情,非常適合在本地操作遠程——你不需要一次又一次的SSH到遠程再進行部署。
    • http://www.scons.org/ Java有Ant這個巨火的構建工具,Python的特性允許我們構建更新類型的構建工具,就是scons了。

3.1  Python IDE

我的IDE選擇經驗 其實我現在只用Vim和Pydev了

  • 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.2  有意思的東西

  • Howie:用Python實現的MSN對話機器人。
  • Cankiri:用一個Python腳本實現的屏幕錄像機。

3.3  普通但沒準有用的東西

  • pyForum:純Python實現的論壇程序中最接近實用程度的一個,基於web2py實現。

4.  內置類庫使用參考

  • Python正則表達式操作指南
    • 爲方便調試正則表達式,可以用KODOS(基於 PyQT )、kiki(基於 wxPython )、Pyreb(基於 wxPython )中的任何一個來輔助。
    • 我目前用的是 kiki,但最近它的官方網站登陸不上去,我從 Debian 包把它的源碼扒出來,應用了 stani 做的wxPython 2.8 兼容性補丁,並且用py2app把它封裝成 Mac 應用程序供 QuickSilver 調用。修改以後的源代碼包下載

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 之類要簡潔方便無數~
  • 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版,當然還有其他的好多。
  • 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 風格的 MongoDBPython 封裝,可是其官網上怎麼說這是一個 object-document mapper ?

5.9  科學計算與數據挖掘

  • NumPy Python的數學運算庫,有時候一些別的庫也會調用裏面的一些功能,比如數組什麼的;
  • SimPy 利用Python進行仿真、模擬的解決方案;
  • Matplotlib 據說是一個用來繪製二維圖形的Python模塊,它克隆了許多Matlab中的函數, 用以幫助Python用戶輕鬆獲得高質量(達到出版水平)的二維圖形;
    • Graphviz 與 Matplotlib 不同,這個東西能畫:有向圖、網絡結構、有限狀態機等等。本身不是 Python 實現的,但是能找到 Python 封裝。

5.10  並行處理

5.11  圖像處理

  • Pil Python下著名的圖像處理庫Pil;

5.12  遊戲開發

  • pygame:用Python幫助開發遊戲的庫,也可以用這個來播放視頻或者音頻什麼的,大概依靠的是SDL;pygame 的 2D 性能比較不錯,硬件兼容性也比較好。
  • pyglet:這個背後依賴的是 OpenGL ,所以硬件兼容性不如 pygame 。但是在有強力顯卡支持的情況下,3D 性能就要比 pygame 靠譜很多了。

5.13  系統工具

  • pyinotify 利用操作系統自身提供的Notify機制以最高的效率監控文件變化。
  • Pexpect:用Python作爲外殼控制其他命令行程序的工具(比如Linux下標準的ftp、telnet程序什麼的),還沒有測試可用程度如何。

5.14  服務管理

  • daemonize:支持讓 Python 代碼在 Unix-like 系統上以 daemon 守護進程的方式工作。這樣寫出來的服務程序就更像一個真正的“服務”了~
  • Supervisor:用這個其實也能實現把一個普通進程封裝成系統服務的功能。

5.15  圖形界面

  • Tk:這個本來是 Python 默認自帶的圖形界面庫,簡單好用但是大家總覺得醜。
    • 其實加上它的外觀擴展Tk Themed Widgets (ttk)會好看很多很多,這樣既不損失任何 Tk 的特性,而且代碼改動量也非常小。不過我在 OSX 下試驗,ttk 弄出來的界面不支持中文輸入法。。
  • wxPython 基於wxWindows的易用且強大的圖形界面開發包wxPython;wxPython發行版還自帶了PyCrustPyShellPyAlaCartePyAlaMode等幾個工具,分別是圖形界面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 框架的。
  • http://avc.inrim.it/html/ 比MVC模式更方便易用的開發框架,主要是幫助透明地完成界面控件與後臺數據之間的內容綁定。該框架支持GTK、QT、TK、wxWidgets等主要具有Python封裝的GUI開發框架。
  • pyjamas:Google GWT的Python克隆,還處在早期版本階段。

5.16  性能調優

  • Psyco、Pyrex:兩個用於提高Python代碼運行效率的解決方案;如果對性能還不滿意,可以試試這樣:用 Python 寫自己的 C Module
  • Heapy 對 Python 程序進行內存佔用剖析的模塊,Guppy-PE 項目的組成部分之一,被 Scrapy 等項目用作內存泄露的調試工具。類似的還有:
    • PySizer,感覺已經太舊了。
    • Dowser,和 Heapy 特點不太一樣,並且使用CheeryPy作爲調試結果的輸出界面。
  • Gluttony Python 模塊之間依賴關係圖的自動生成工具。

5.17  檢查與測試

  • PyflakesPyCheckerPyLint:都是用來做Python代碼語法檢查的工具。
  • Fudge 被HD的項目組認爲是最好的Python Mock模塊(也即冒煙測試)。
  • nose 測試腳本自動發現、自動執行輔助工具。文檔見nose documentation
  • Coverage.py Python 測試代碼覆蓋率統計工具,已經內置於 nose 。

5.18  程序發佈

  • 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.19  移動終端支持

5.20  Excel 讀寫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章