使用ctypes在Python与C++间通过.so文件交互时的参数传递及返回值异常问题排查
Python调用MinGW编译的C++共享库时的数值传递问题
我肯定是犯了某个低级错误,但翻来覆去就是找不到……索性把问题简化成下面的示例,这下问题就明明白白了——我完全没法在Python和C++之间顺畅地传递数据、获取返回值。
测试用C++代码
extern "C" double reflect(double inp){ return inp; }
编译命令
g++ -c -Wall -Werror -fPIC test.cpp -o testO.o g++ -shared -o testSO.so testO.o
Python调用代码
和我实际项目里的用法一致:
import ctypes hdl = ctypes.cdll.LoadLibrary(r"C:\Windows\path\to\testSO.so")
测试结果
hdl.reflect(1)>>> 1(没做ctypes类型转换,但结果还正常)hdl.reflect(1.1)>>> 执行失败(这个结果倒是符合预期)hdl.reflect(ctypes.c_int(1))>>> 1(c_int隐式转成c_double好像可行)hdl.reflect(ctypes.c_float(1.1))>>> 1006192077(结果完全不对)hdl.reflect(ctypes.c_double(1.2))>>> 858993459(结果也异常)
我的运行环境是Windows 10,编译器用的MinGW-W64 8.1.0,Python是3.8版本(Anaconda发行版)。之前也运行过DLL,自己也编译过C语言的Python模块,但这次就是找不到问题出在哪!?
编辑补充:已经修正了Topological Sort指出的拼写错误(代码里的.so文件路径是正确的,刚才这里漏了末尾的引号)
内容的提问来源于stack exchange,提问作者Amiga500
相关产品推荐
相关产品推荐

