天天看點

python 調用dll_發現python調用動态庫的一個bug

python 調用dll_發現python調用動态庫的一個bug

事情是這樣的,在頭條看到一篇文章《【基礎篇】Python+Go——帶大家一起另尋途徑提高計算性能》,文章中發現一個問題,但并沒說問題的解決。問題如下:當動态庫接口函數傳回一個int64類型的傳回值,python調用這個接口函數後,接收函數傳回值時隻有低4個位元組的資料位。原文章是用golang生成的動态庫,本人用C寫了個簡單的動态庫接口來複現這個問題,接口的聲明和定義如下:

dll.h

__int64 retint64(void); 
           

dll.c

__int64 retint64(void){     return 0x746A4AE6E0; } 
           

在python中調用代碼如下:

import ctypes dll = ctypes.CDLL('s1.dll') int64_r = dll.retint64() print("int64_r = 0x%X"% int64_r); 
           

python執行的結果:

int64_r = 0x6A4AE6E0 
           

上述C動态庫的環境是MinGw64(gcc 8.1.0是64位),python的版本3.7.6(64位),OS系統是windows7(64位),linux的環境尚未試驗。

gcc -v

gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 
           

python

Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. 
           

本人分析出現這個問題的原因是python在處理動态庫的函數傳回值時用一個int32類型資料(4位元組)來接收,超過4位元組的有效位數就會丢棄。這應該是python的一個小bug,歡迎各位看官讨論。

繼續閱讀