python和ctypes cdll,没有从函数中获得预期的回报
Posted
技术标签:
【中文标题】python和ctypes cdll,没有从函数中获得预期的回报【英文标题】:python and ctypes cdll, not getting expected return from function 【发布时间】:2012-05-11 02:25:26 【问题描述】:我正在开发一个触觉机器人和眼动仪的接口。因此,两者都有自己的编程要求,即眼动仪软件基于 python,是我编程的主要语言。我们的触觉机器人有一个 C 语言的 API,所以我不得不用 C 语言编写一个包装器,将其编译为 DLL,并在 python 中使用 ctypes 来加载函数。
我用 MATLAB 测试了我的 DLL,一切正常。但是,当我查询机器人的位置坐标时,关于我在 python 类中实现 ctypes 的一些事情并没有给我预期的返回值。
我把代码贴在这里,在底部对问题有更清晰的解释。
DLL 包装器的 C 源代码:
#include <QHHeadersGLUT.h>
using namespace std;
class myHapClass
public:
void InitOmni()
DeviceSpace* Omni = new DeviceSpace; //Find a the default phantom
double GetCoord(int index)
HDdouble hapPos[3];
hdGetDoublev(HD_CURRENT_POSITION,hapPos);
return hapPos[index];
;
extern "C"
int index = 1;
__declspec(dllexport) myHapClass* myHap_new() return new myHapClass();
__declspec(dllexport) void myHapInit(myHapClass* myHapObj) myHapObj->InitOmni();
__declspec(dllexport) double myHapCoord(myHapClass* myHapObj) double nowCoord = myHapObj->GetCoord(index); return nowCoord;
此代码的理论只是拥有 3 个与 python/ctypes 兼容的可用 C(不是 C++)调用:
-
myHap_new() 返回指向类实例的指针
myHapInit 初始化触觉设备
myHapCoord 为 int Index 所引用的轴的当前位置返回双精度值。
python 类如下:
import sreb
from ctypes import cdll
lib = cdll.LoadLibrary('C:\Documents and Settings\EyeLink\My Documents\Visual Studio 2010\Projects\myHapDLLSolution\Debug\myHapDLL.dll')
class CustomClassTemplate(sreb.EBObject):
def __init__(self):
sreb.EBObject.__init__(self)
self.pyMyHapObj = pyMyHap()
self.coordval=2.0
def setCoordval(self,c):
self.coordval = c
pass
def getCoordval(self):
return self.coordval
def initOmni(self):
self.pyMyHapObj.pyHapInit()
pass
def getCoord(self):
self.coordval = self.pyMyHapObj.pyHapCoord()
return self.coordval
class pyMyHap(object):
def __init__(self):
self.obj = lib.myHap_new()
self.coord = 1.0
def pyHapInit(self):
lib.myHapInit(self.obj)
def pyHapCoord(self):
self.coord = lib.myHapCoord(self.obj)
return self.coord
python自定义类的原理是实例化加载的DLL类的一个对象(self.pyMyHapObj = pyMyHap())。调用函数“initOmni”成功初始化机器人,但是调用“getCoord”不会返回预期值。事实上,我从“getCoord”得到的结果是 1(它被列为 1,而不是 1.0,所以我认为它返回的是一个整数,而不是应该返回的 double)。
在MATLAB中,我使用了DLL库,myHapInit和myHapCoord函数都可以正常工作,可以初始化机器人并成功查询位置坐标。
那么,我的 python 类导致 ctypes 没有从我的 DLL 中的 myHapCoord 返回的正确值是什么原因?
任何帮助将不胜感激。 谢谢
编辑:Python 2.3 版,如果重要的话……我坚持使用那个版本。
【问题讨论】:
【参考方案1】:返回值默认为int
。使用类似的东西:
lib.myHapCoord.restype = ctypes.c_double
在调用函数正确解释返回值之前。
【讨论】:
嗯。这是有道理的,因为 matlab 需要 DLL 的头文件,从中获取参数类型。 python/ctypes 中没有任何内容要求标题,所以这是有道理的。希望将输出流式传输到声明为 double 的变量会自动将其转换为正确的类型,但我对 python 不太了解,所以我想不会......明天我在实验室时会首先尝试。谢谢! 不客气!有关详细信息,请参阅docs.python.org/library/ctypes.html#return-types。对你有用记得采纳哦:^) 效果很好,谢谢。我浏览了一些 ctypes 教程,但它们非常广泛,我错过了。其他有用且相关的信息是找到 .argtypes = ... 来定义输入参数类型。此外,我还必须包含类似“from ctypes import c_double”的内容。再次感谢!以上是关于python和ctypes cdll,没有从函数中获得预期的回报的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python 的 ctypes 调用涉及自定义类型的函数