原文链接: http://www.juzicode.com/python-error-ctypes-call-dll-function-return-error/
错误提示:
ctypes调用DLL中函数返回结果错误。
// juzicode.com/ VX: 桔子code
#include "stdio.h"
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) float addfloat(float x, float y)
{
return x + y;
}
#ifdef __cplusplus
}
#endif
# juzicode.com/ VX: 桔子code
from ctypes import *
import os,sys,platform
print('sys.version:',sys.version)
add_path = os.path.split(os.path.abspath(__file__))[0]+'\\'
pyt = CDLL(add_path+'pytest.dll')
pyt.addfloat.argtypes=(c_float,c_float)
z = pyt.addfloat(10.1,20.2)
print('z =',z)
==========运行结果:
sys.version: 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)]
z = 1977958797
正确的结果应该是30.3,但是得到的结果是1977958797。
错误原因:
1、C函数的返回类型是float,但是在Python中没有声明该函数的返回类型为c_float,而默认使用了c_int,导致类型转换错误,需要增加函数返回类型的声明.
解决方法:
1、增加函数返回类型的声明。
# juzicode.com/ VX: 桔子code
from ctypes import *
import os,sys,platform
print('sys.version:',sys.version)
add_path = os.path.split(os.path.abspath(__file__))[0]+'\\'
pyt = CDLL(add_path+'pytest.dll')
pyt.addfloat.restype=c_float #增加函数返回类型的声明
pyt.addfloat.argtypes=(c_float,c_float)
z = pyt.addfloat(10.1,20.2)
print('z =',z)
==========运行结果:
sys.version: 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)]
z = 30.30000114440918
扩展内容:
- Python进阶教程m7–混合编程–调用可执行文件
- Python进阶教程m7b–混合编程–C语言接口ctypes(1)
- Python进阶教程m7c–混合编程–C语言接口ctypes(2)
- Python进阶教程m7d–混合编程–代码级扩展
如果本文还没有完全解决你的疑惑,你也可以在微信公众号“桔子code”后台给我留言,欢迎一起探讨交流。