在一个偶然的机会下,今年元旦(2015/01/01),才开始正式接触python这门优雅的语言.那时,协助公司的测试部修改一些测试脚本,边看脚本边学习边修改。不得不说,python优雅得体,容易上手。大约改了两周,协助任务完成,python也丢弃一旁了。
直到前几天,2015/04/15晚上,看到部门几个开发组长在讨论,我们的产品购买的第三方库,某个功能无法实现,而我们购买那家第三方库的公司,只提供了一个python脚本,尽管此python脚本能实现功能,但是我们部门均没有接触过python(唯一会python的测试开发人员请产假了,囧)。最可怕的是,2015/04/20需要给客户演示此功能,真是伤不起,完全没有时间去把python修改为C++。
而我恰好,曾经用过python,提议把该python封装成C/C++接口。开发组长一致认同,就由我来把脚本封装成C接口。在此之前没有做过C++调用python,完全没有想到后续的麻烦。
C++调用python脚本,其实并不难。网上一搜一大把教程啊,简单易懂。http://www.360doc.com/content/14/0217/09/13084517_353130057.shtml
VC下写了个demo,很是方便,但是,Debug版本和Release版本略有差异。Debug版本用的是pythonxx_d.lib,而Release版本用的是pythonxx.lib。python解释器无pythonxx_d.lib。
只需修改python的include目录下的pyconfig.h,将pragma comment(lib,"python27_d.lib")修改为pragma comment(lib,"python27.lib"),同时,注销 ifdef _DEBUG define Py_DEBUG endif。
封装完成之后,问题才真的来了:调用python脚本,需要python解释器,这个真的是让人无语,如果我调用一下python脚本,那么我们的产品也要同时打包发布python解释器?这个增加产品体积不说,也会降低用户体验。网上搜了很多这方面的解决方案,也在很多交流群里询问,都没有给出答案。
有提出替代方案的,把python脚本打包成exe,这样无需发布解释器。这个确实也是个备份方案。但是这样会同时增加开发工作,同时,让程序去调用exe,有需要涉及一些进程通信,而我实在是无力修改python脚本,该脚本各种协议和硬编码,很是头疼。
本着死马当活马医的心态,尝试了一下把python打包成exe,此方法也很是简单,用py2exe,同样网上一搜一大把教程:http://blog.chinaunix.net/uid-25979788-id-3064613.html
打包完成以后,我发现产生了一个library.zip文件,解压缩后,里面一堆pyc文件。脑洞大开的时候到了,为什么产生exe之后就可以不用python解释器了呢, 而C++调用脚本就必须要python解释器呢?其实这个library.zip就相当于是裁剪python解释器,而我调用py脚本也可以这样来裁剪解释器。于是我写个demo程序,把这些pyc文件靠到工程里面,Debug的时候,报错:ImportError:No module named site,然后我就把site.py放到工程目录,再次Debug又报错:ImportError:No module named sysconfig,再把sysconfig.py放到工程目录,此时Debug成功了,裁剪解释器成功了。
总结一下:此时调用py脚本的依赖库如下:1、_ctypes.pyd,2、pythonXX.dll,3、各种pyc文件,可打包成library.zip文件。我用到的library.zip仅为414KB。
后续,希望可以好好的理解一下python的解释器,python太过优雅,完全吸引了我。
开发环境为VS2008+Python27
后续学习任重道远,此为本人第一篇原创技术博客,记录工作学习所获所得,以后多多学习多多记录,勉之。
ZhaiPillary
2015/04/18