摘要:
本文介绍了一种简单快捷的方法,实现在64位Python调用32位DLL.
引言:
Python发展到现在,3.x的普及率已经相当高,而且随着硬件(内存的不断增大)以及操作系统(64bit windows)的发展,64bit的3.x python 的占有率不断提高.但是随之带来的问题就是,长期积累下来的很多库文件由于各种各样的原因没有同步与时俱进,仍然停留在32bit 2.x时代.对于python版本的2/3之别,问题不大,方法很多,这也不是本文的关注对象,暂且不提.32bit到64bit的跨越就是一块硬骨头,如下图所示.显然,这个难点长期以来困扰大家,给大家带来极大不便,亟待解决.
通过网络搜索可知,目前没有靠谱的解决方案.普遍的看法是,这个问题没有直接方法能够解决,这基本上是个公认的结论.这是由于在64位的windows系统中,一个64位进程不能加载一个32位dll,同理一个32位进程也不能加载一个64位dll。Python解释器的常规实现CPython本身也是一个进程,如果它被编译64位程序,那么也就无法直接加载32位的dll了.那么只有通过非直接的方式,替代性的方案,主要是以下几种:
- 如果对dll的调用不频繁并且对于运行结果的处理要求比较简单,可以在系统中同时安装32位和64位的Python解释器。在运行于64位Python解释器的代码中,通过subprocess启动32位的Python解释器运行python代码加载32位的dll。 用32位py调用DLL,生成EXE,也可以,效果同上,但额外需要一个生成EXE的过程。
- 如果对dll的运行结果要求频繁快速的处理,那么可以使用进程间通信(RPC)。分别启动32位和64位的Python解释器,两者之间用RPC通信。简单的RPC用socket自己写就行,或者基于rpyc这种第三方python库,如果是企业级别的应用可以选择Thrift。这个方法的好处是,32位和64位的Python解释器可以分别部署在不同机器上。
- 如果对运行性能要求非常高,那么可以考虑用C语言写代码包装dll,创建COM服务器,将32位dll的接口函数封装为COM服务器的相关接口。在注册表中注册COM服务器。64位python用第三方python库comtypes来访问COM对象。这个只适用于Windows平台。
- 如果有对应dll的源码,那么可以重新配置成64位方式编译,获得64位的dll,就可以直接调用了。
方案4是最佳选择,但往往是最没可能实现的选择,原因很多,不予赘述.1,2,3的基础是Inter-process_communication.这种方式,一般来说,难度都比较高,对于python普通用户很有挑战性.那么有没有一种方案能够便捷的实现Inter-process_communication呢?下面所介绍方案,目前来看是最好的选择.