事情是這樣的,在頭條看到一篇文章《【基礎篇】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,歡迎各位看官讨論。