从一件小事看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如何备份目录及目录下的全部内容

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...