Category Archives: Python

PO檔自動繁簡轉換程式

最近在更新我的網站Now.in,最麻煩的一項工作就是國際化,通常我都是先以英文寫網頁,接著用TurboGears2的i18n功能將字串訊息取出,而我的GUI程式的i18n流程也差不多,都是先寫英文,翻成繁體中文,其中一個最腦人的過程,就是把翻好的繁體中文po檔裡的字串剪下貼上到google翻譯將它變成簡體中文再貼到簡體中文的po檔裡,這些工作都是重覆性極高的機械性動作,在一開始句子還少時做還可以,當字詞越來越多,這就變成一件痛苦的工作,既然是高重覆性的工作,為什麼需要人力來做呢? 於是我就寫了一個小程式,可以自動把po檔的內容抓出來丟到google翻譯去,把結果寫到另一個po檔中 # -*- coding: utf8 -*- ”’ Created on 2010/4/27 @author: Victor-mortal ”’ import os import sys import urllib import json import logging import optparse import codecs import htmllib log = logging.getLogger(__name__) def unescape(s): p = htmllib.HTMLParser(None) p.save_bgn() p.feed(s) … Continue reading

Posted in Python, 中文文章, 分享 | Tagged , , , , , , | 4 Comments

一些有用的Python函式庫列表

Python有豐富的第三方函式庫或是工具,我一直想說要整理一篇列表,今天找了一點時間整理了一下我所知道的或是用過的 視窗GUI開發 wxPython 跨平臺的GUI開發函式庫,由wxWidget移植而來,特點是原生介面 PyQT 同樣也是著名的跨平臺GUI函式庫,由QT移植而來,可惜的是它是在於GPL條款下,商業用途需要另外買授權 PySide 因為PyQT為GPL授權,所以有人另外出來搞了另一套QT的移植,它是在LGPL條款下,因此商業軟體也適合 PyGTK GTK的Python移植版 遊戲開發 pygame 一款簡單的2D遊戲開發函式庫,主要是基於SDL Python-Ogre 著名Open source 3D遊戲引擎Ogre的Python移植版本 pyglet 一款跨平台的多媒體函式庫 PyOpenGL OpenGL的python移植 Python-Hge 我寫的HGE 2d遊戲引擎的Python移植版,大致上還算可用狀態,有些部份還沒移植完全 網頁開發 Flask 基於Werkzeug,以輕量為主要特色的網頁框架,簡單易用,沒有太大負擔,讓人喜愛的一款容易上手的網頁框架 Werkzeug 不算是網頁框架,它提供了開發WSGI常會用到的功能,不喜歡什麼都已經準備好的網頁框架,又不想重頭寫起可以試試看 Pyramid 這是結合了Pylons和BFG之後的新一代網頁框架,有完備的文件和號稱100%測試覆蓋率著稱 TurboGears 集大成的網頁開發框架,它是組合各種合適現成的組件而成的網頁框架,因此藕合度較鬆散,可以抽換掉某些組件,第一版用的組件主要為Cherrypy為網頁伺服器、Kid為預設樣版引擎、SQLObject為ORM,而第二版架構在另一套輕量框架Pylons上,ORM改為SQLAlchemy,預設樣版改為Genshi,並且符合WSGI的規範 Django 知名的Python網頁開發框架,不同於TurboGears的集大成,它的框架是自成一體的,所有組件從樣版到ORM都是獨力完成的 Web2py 一窾很有趣的網頁框架,它的框架本身就包含了整個完整的開發環境,所有開發都是在它的網頁程式上完成的 Webpy 跟Web2py很容易搞混,但其實是另一窾不同的網頁框架 BFG … Continue reading

Posted in Python, 中文文章 | Tagged , , , | 10 Comments

Memory efficient Python with bytearray

The story I was developing an audio broadcasting server.  I wrote the server with Twisted.  It works fine, but there is still a big problem to solve: the memory usage.  My audio broadcasting server use memory so much.  You can … Continue reading

Posted in English Articles, Python, 分享 | Tagged , , , | 1 Comment

Ajax/Comet實作聊天室心得

今天為now.in做了一個最陽春版本的聊天室 這聊天室用了AJAX/Comet技術,說穿了AJAX/Comet真的沒什麼,其實不過就一個http request在server端在接受到後,直到有事件發生才回傳,也有另一種做法是利用比較特別的header讓browser對於每次收到的資料分批處理,而這些都在一個response中完成,因為似乎後者還得有browser的支援,所以我用的是前者,而雖然概念上很簡單,但實際做起來會有些細節得注意的 前端不可以有proxy 原本我寫好後放上去結果不能跑,發現原因出在於透過WebFaction前端的Apache再rewrite到我的server,似乎在前端的連線數很快就被擠暴了,因為線上會有數百個連線一直在線上,所以如果前端有proxy,很容易就會被塞暴,後來改用直接連線,問題就解決了 一般的伺服器架構其實根本不適合Ajax/Comet 事實上一般常見的伺服器架構大多都不適合寫Ajax/Comet,為什麼呢? 原因很簡單,大多的伺服器架構都是thread pool之類的做法,一個連線進來,就從thread pool中拿一個worker丟給他去做,在完成之前都屬於在處理的階段,因此你有同時100個連線被Ajax/Comet卡住,就佔掉了thread pool中100個worker,這些worker什麼都不能做,通常只能sleep,定期檢查事件發生了沒,除了伺服器很快就會被塞暴以外,一點效率都沒有,像是Apache就是這類的架構 解決的方案: 非同步的IO 解決方案其實很簡單,就是改用非同步IO的網路框架,我個人最熟的就是Twisted,自然就是選擇這個,身為愛好Python的程式設計師,其實很多時候苦腦的不是沒有選擇,而是選擇太多,Python的非同步網路函式庫不是用一打就能數完的,多到誇張的一個地步,而且一直在增加,不久前又多出了一個Tornado,這也只是冰山一角,有人寫了一篇文章專門是在比較Python非同步網路函式庫的 Asynchronous Servers in Python 當然,這文章裡列出的也只是一部份而已 Twisted的Ajax/Comet做法 class Chatroom(resource.Resource): isLeaf = True def wait(self, request): “””Wait for notifications “”” self.waitingRequests.append(request) log.debug(‘[%s] %d users are waiting’, self.name, len(self.waitingRequests)) … Continue reading

Posted in Python, 中文文章 | Tagged , , , , , , | 8 Comments

Python套件依賴關係圖工具: Gluttony

前一陣子在裝TurboGears2時遇到某個套件因為依賴的某個套件不支援Python2.6,無法使用easy_install成功安裝,必需先手動安裝那個套件再安裝TurboGears2,我當時覺得很討厭,就開始思考,當一個專案的依賴套件越來越多時,只要其中有一個套件不能用,整個系統可能就會因此無法使用,特別是在越底層的套件出問題,所造成的影響可能就會越大,我開始想說,如果我們能夠把這些套件之間的依賴關係圖用一個工具畫出來,那就可以瞭解它的依賴情況,如此一來在決定是否要使用或是找問題時會較容易,也可以研究依賴關係對於大型專案會造成的影響,於是就花了一點時間寫了一個工具,是基於pip上面的,它叫做Gluttony,如果有看過鋼之鍊金術士大概就知道那是什麼東西,七原罪之一的暴食,因為我看那工具在爬依賴套件時就像在瘋狂吃東西似的,於是就想到這名字,而且這個名字在pypi裡沒有人用,於是就選了這個名字 工具的用法和下載、安裝等等,都可以在Google code的頁面找到,在此就不贅述 Google code: Glottony 一些專案的依賴關係圖 當我完成這些工具之後,最開心的事就是去找一些專案來跑跑看,看到底會出現什麼結果 TurboGears1.1 像這樣的依賴關系其實算還好,簡單明瞭,而且也很有結構 TurboGears2 我們可以發現在TurboGears2的依賴關係又更複雜了一些,因為它是架構在Pylons上,所以大部份依賴都在Pylons上,而devtools是用於開發用的工具,事實上有一些細節上的依賴關係會在setup專案時才會被裝進來,因為TurboGears2講求的是彈性,像是Template language就可以支援好幾種,也可以自行將那部份換掉,所以圖上可能看不到,整體上來看,這樣的依賴關係算是還蠻健康的,層次分明,接著我們就來看一個病態一點的例子 Plone 點圖片下載全尺吋圖檔 你一定在想這沱黑黑的到底是什麼東西,別懷疑,這個是Plone的套件依賴關系圖,全圖檔案大小是19.3MB,原本圖檔還太大,Graphiz還render不出來,我是縮小了一點尺吋才畫出來的,看了我真的覺得這實在是太誇張了,Plone到底是怎樣開發出來的,我很慶幸當時把ez2learn.com從Plone移到其它CMS,我原本還打算學Plone怎麼玩,還好當時覺得他底層東西實在太多,不然可能到現在我還在研究 囧

Posted in Python, 中文文章 | Tagged , , , | 7 Comments

讓Python程式出錯時自動寄信給你

我喜歡Python的原因之一就是它的標準函式庫把該有的東西幾乎都包進去了,像是ConfigParser用來讀取設定檔,而logging更是不可缺少的,用來記錄程式的訊息非常好用的函式庫,而且這些函式庫不是只是陽春的玩具,而是功能齊全的基礎,其中logging一個很棒的功能就是將錯誤訊息寄給你,因為通常錯誤發生雖然都可以寫到記錄檔中,但是你有多少時間會去翻記錄檔? 通常程式出錯了,你也不會有認何知覺,將錯誤訊息寄給你的好處就是,一有錯誤你就立刻可以知道,而且少見的錯誤也不會被漏掉,例如有人試圖攻擊你的伺服器,在這過程中如果伺服器發生錯誤會寄信給你,在他成功之前你可能就有機會發現,總之將錯誤訊息寄給自己是很有用的技巧 一個錯誤報告的例子 最棒的就是,要用此功能非常簡單,以下是一個簡單的範例: # -*- coding: utf8 -*- import logging import logging.handlers rootLogger = logging.getLogger(”) rootLogger.setLevel(logging.ERROR) handler = logging.handlers.SMTPHandler( mailhost=’smtp.example.com’, fromaddr=’marines@starcraft2.com’, toaddrs=’player@starcraft2.com’, subject=”Houston, We’ve Got a Problem”, credentials=(‘username’, ‘password’) ) rootLogger.addHandler(handler) log = logging.getLogger(__name__) log.fatal(‘HELP! We are under attack!’) … Continue reading

Posted in Python, Uncategorized, 中文文章 | Tagged , , , | Comments Off on 讓Python程式出錯時自動寄信給你

化整為零的次世代網頁開發標準: WSGI

介紹Python網頁開發的標準: WSGI Continue reading

Posted in Python, 中文文章 | Tagged , , , , , , , , , | 17 Comments

The best choice to grab data from websites: Python + Twisted + lxml

The best choice to grab data from websites: Python + Twisted + lxml Continue reading

Posted in English Articles, Python | Tagged , , , , , , | 34 Comments

An auto-retry recipe for Twisted.

I wrote a retry function that can warp all function return Deferred that might fail. That’s no need to modify any exists code of getPage to make it to retry automaticllay. Continue reading

Posted in English Articles, Python, 分享 | Tagged , , , , | 1 Comment

Autostart script for TurboGears2

A autostart script for TurboGears2 and Pylons Continue reading

Posted in English Articles, Python, 網站 | Tagged , , , | Comments Off on Autostart script for TurboGears2