摘要:
本文介紹了一種簡單快捷的方法,實現在64位Python調用32位DLL.
引言:
Python發展到現在,3.x的普及率已經相當高,而且隨著硬件(內存的不斷增大)以及操作系統(64bit windows)的發展,64bit的3.x python 的占有率不斷提高.但是隨之帶來的問題就是,長期積累下來的很多庫文件由于各種各樣的原因沒有同步與時俱進,仍然停留在32bit 2.x時代.對于python版本的2/3之別,問題不大,方法很多,這也不是本文的關注對象,暫且不提.32bit到64bit的跨越就是一塊硬骨頭,如下圖所示.顯然,這個難點長期以來困擾大家,給大家帶來極大不便,亟待解決.
Paste_Image.png
通過網絡搜索可知,目前沒有靠譜的解決方案.普遍的看法是,這個問題沒有直接方法能夠解決,這基本上是個公認的結論.這是由于在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呢?下面所介紹方案,目前來看是最好的選擇.