一件关于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/
【编辑推荐】