從一件小事看Python
一件關于Python開發的小事,折騰了一天還是失敗了,是Python難搞還是有別的原因?且看……
近日用webpy開發了一個小Web應用,用到了PIL(一個圖形庫)。在把它部署到正式的Linux服務器之前,我覺得有必要在Windows上先“仿真”測試一下,用Windows+Apache+WSGI+webpy+PIL環境測試一下這個Web應用。但不幸的是,這個測試環境最終沒有搭建成功。
我的Windows開發環境下有Python2.5/2.6/2.7三個版本。我一直使用2.5作為默認的Python版本。那個Web應用也是在2.5下開發的。而且我的Linux服務器上也用2.5。
我遇到的***個問題是:Windows上WSGI只有兩個官方binary,分別對應Python2.6和2.7,沒有2.5。對我來說,如果要維持一貫的Python環境(包括服務器部署環境),就必須自己編譯WSGI的Python2.5版本。這件事非常麻煩:首先是必須使用跟Python2.5的binary相同的編譯器——VC2003(這種古董我都沒地方去找,我機器上只有VC2010)。其次還要找到所有相關的(且正確的)C鏈接庫,如libhttpd.lib等。如果我使用官方的WSGI binary,我只能把環境轉換到高版本的Python,雖然這仍然意味著不少工作——包括服務器環境的整體升級等等,但我考慮再三,決定還是升級Python。
但我馬上就遇到了第二個問題:PIL庫的官方binary在Python2.7上不能工作!在加載_imagingft時會報告錯誤“ImportError: DLL load failed”。用depends工具檢查發現缺少MSVCR90.dll,就到MS的網站上下載了VC++ 2008的 Redistributable Package。但安裝后問題依舊。抓狂!其后一度研究了自行編譯PIL,發覺這事兒也不簡單,遂放棄,繼續找問題原因。***還真讓我找著了https://bitbucket.org/effbot/pil-117/issue/1/windows-build-of-_imagingft-module-fails-to。簡單說就是:PIL官方binary編譯有問題:_imagingft.pyd(動態鏈接庫)鏈接的是MSVCR90.dll的DEBUG版本(話說這個問題存在一年以上了,官方就不管管嗎)!所以即使安裝了VC2008的Redistributable Package也沒用(DEBUG版本不在發行版中)!解決辦法就是用二進制編輯器修改嵌在DLL里的manifest(這個辦法我覺得較危險),或者用mt.exe工具從DLL導出manifest,修改后再導入DLL。mt.exe的用法可參考MSDN文檔http://msdn.microsoft.com/en-us/library/aa375649(v=vs.85).aspx。
解決了這兩個問題,大半天過去了。就在我以為萬事俱備的時候,第三個問題出現了,并且一劍封喉:在Apache的WSGI環境下PIL還是可恥的加載失敗了——在import _imaging的時候,報告“ImportError: DLL load failed”。我再次抓狂了:我打開Python控制臺,直接import imaging,沒有問題。那么問題再哪兒?從日志上看,Python及其庫的路徑是沒問題的。那么問題再哪兒?問題可能在這兒:http://groups.google.com/group/modwsgi/browse_thread/thread/59612820615eceaf,Graham(WSGI的作者)在這個帖子里說:
That is, Python 2.6+ links to newer MS C runtime library that Apache doesn’t and C extension modules which are somehow dependent on the newer MS C runtime library will not load properly.
就是:Apache鏈接的C動態庫與Python2.6+不同,因此后者的C擴展庫(比如_imaging)不能工作在前者的環境里。解決的辦法是:
If I am sort of right, the solution may be to relink mod_wsgi.so for Windows with dependency on new MS C runtime library.
就是要重新編譯WSGI!問題又回到了原點!
從這件事情上,我看到的是:Python在Windows上問題重重,考慮到數不清、理還亂的C運行時庫問題以及復雜的編譯環境。相對而言,Linux的情況要好很多:借助于方便的安裝包功能,即使需要編譯安裝的Python庫也比較容易處理(BUG也比Windows要少)。
后記:
在Linux服務器上,我的Python+WSGI+Apache的環境還算順利,但是Windows上做相同的事情看來難很多。但是應用的開發、測試需要一個同實際相當的環境,如果在Windows上開發、測試時用簡易Web服務器,部署時采用Apache+WSGI,顯然是不大合適的。那么,最終的解決方式,看來就是在Linux上做開發。不過要我舍棄經營多年的Windows,仍然不是一件輕易的事情。
原文鏈接:http://www.nearby5.com/2011/06/29/python-in-my-view/
【編輯推薦】