python 调用dll_发现python调用动态库的一个bug

d16ec52f2ed32ede8664e28a82a61634.png

事情是这样的,在头条看到一篇文章《【基础篇】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,欢迎各位看官讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值