从一件小事看Python
创始人
2024-08-02 04:40:18
0

一件关于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/

【编辑推荐】

  1. 分享两个Python web框架:Django&Tornado
  2. Python高手是如何练成的
  3. Python入门之你必须了解的实用技巧
  4. Python入门之你必须了解的基础知识
  5. Python如何备份目录及目录下的全部内容

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...