从一件小事看Python

开发 前端 后端
近日用webpy开发了一个小Web应用,用到了PIL(一个图形库)。在把它部署到正式的Linux服务器之前,我觉得有必要在Windows上先“仿真”测试一下,用Windows+Apache+WSGI+webpy+PIL环境测试一下这个Web应用。但不幸的是,这个测试环境最终没有搭建成功。

一件关于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如何备份目录及目录下的全部内容
责任编辑:陈贻新 来源: nearby5.com
相关推荐

2010-10-26 10:54:51

周鸿祎

2015-06-12 10:01:25

程序员代码

2021-12-06 13:54:05

全息数据存储存储数据存储

2013-07-08 16:00:58

OpenFlow软件定义网络SDN

2021-06-01 11:18:14

云计算机密云云安全

2012-09-06 09:57:34

Saas云安全云计算

2020-11-26 06:48:51

限流扩容java

2021-10-18 05:42:23

代码编码开发

2020-06-11 21:46:05

个性化医疗保健物联网IOT

2022-07-22 09:37:26

BunWebpackJavaScript

2018-02-05 08:43:57

2022-06-02 14:32:36

加密货币比特币以太坊

2021-04-20 10:06:57

微软Nuance公司人工智能

2018-07-03 16:00:25

无服务器云计算公共云

2017-04-28 15:49:43

2023-07-24 14:18:04

数据中心综合布线

2018-09-27 12:34:33

物联网汽车工业IOT

2017-06-22 15:55:57

运维企业FreeWheel

2016-01-22 11:51:36

测试浪费时间

2017-07-12 10:25:17

Python微信itchat 包
点赞
收藏

51CTO技术栈公众号