- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在研究连接触觉机器人和眼动仪。因此,两者都有自己的编程要求,即眼动仪软件基于 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 个可用的 C(不是 C++)调用,它们将与 python/ctypes 兼容:
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 版,如果重要的话……我坚持使用那个版本。
最佳答案
返回值默认为 int
。使用类似的东西:
lib.myHapCoord.restype = ctypes.c_double
在调用函数之前正确解释返回值。
关于python和ctypes cdll,没有从函数中获得预期的返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10544630/
我有一个由两个 dll 文件和一个 python 包装器组成的库。 我目前有基于这三个文件的代码,它们与我的主 python 文件位于同一父目录中。我现在正试图在继续开发之前重构一些东西,并希望将所述
我正在研究连接触觉机器人和眼动仪。因此,两者都有自己的编程要求,即眼动仪软件基于 Python,并且是我编程的主要语言。我们的触觉机器人有一个 C 语言的 API,所以我不得不用 C 语言编写一个包装
来自https://docs.python.org/3/library/ctypes.html#loading-shared-libraries Shared libraries can also b
我正在尝试使用编译为 /usr/local/lib/libName.so 的库,但在运行需要此文件的 python 脚本时: from ctypes import CDLL [...] __lib =
在 Lubuntu 18.04 上 $ python3 >>> from ctypes import * >>> libc = CDLL("libc.so.6") >>> libc.printf 我
根据文档, On Linux, it is required to specify the filename including the extension to load a library, so
恐怕我在互联网上找不到一个简单的答案,所以也许将来会有一个因为这个问题! 我正在使用 pywiiuse,它是 Windows 上 C wiiuse 库的 python 包装器。通过在源目录中包含 dl
我有一个用于与 C 库交互的 Python 2.7 GUI。我在 GUI 中进行了一系列设置,然后按下“开始”按钮。然后,我正在查看结果,不再需要库代码。但我想在更改库时保留所有 GUI 状态。 我用
我正在尝试使用 ctypes 通过 Python 移植一些 C dll(FANUC FOCAS Library - for CNC)代码,所以我编写了移植代码。 (如下),但是在加载DLL和调用函数时
我有以下代码 import ctypes lib1 = ctypes.cdll.LoadLibrary("./mylib.so") # modify mylib.so (code generation
我正在尝试使用 ctypes 并两次加载相同的编译 Fortran 库,这样我就有了它的两个独立实例,这样库包含的任何模块变量都不会存储在相同的内存位置。描述的一般解决方案(例如,此处:https:/
ctypes.cdll.LoadLibrary() 调用如何与作为参数传入的 None 一起工作?当我尝试下面的代码时,math 库似乎会自动加载: >>> import ctypes >>> lib
我是 Python 的初学者。我使用的python版本是3.2.1.1我正在尝试按照 docs.python.org 中的教程学习 ctypes 在交互式提示中, import ctypes libc
问候, 我正在尝试修改 zlib 和测试行为,所以我编写了 mylib.c 和 mylib.h。这形成了一个用于在内部调用 zlib 函数的包装器(如 InflateInit2())。我正在使用以下命
我必须遵循以下目录结构: MainProject | ...project files | rtlsdr\ | | rtlsdr.dll
我用c写了一个dll库,用vs2017 64位编译,用python3.6 64位加载试试。但是,对象的成员变量地址被截断为 32 位。 这是我的 sim.c 文件,它被编译为 sim.dll: cla
我正在尝试让一些开源学术代码正常工作(项目主页是 here )。它是一个带有(非常)薄的 python 包装器的大型 C++ 代码库,它使用 CDLL 加载 C++ 并调用一些可用于允许代码的原始 p
因此,作为一名 Linux 用户,我在 Windows 上遇到了一些我无法解释的非常令人费解的事情。 我有一个类似于此示例的项目结构: D:\PROJECT | | tolkien.py |
我是Python初学者。当我尝试加载外部 DLL(由其他人在 Windows 中编译)时,如下所示: from ctypes import * import cv2, cv as cv Painter
我刚刚开始在 Linux 上使用 gcc。我正在学习教程 here , 除了我使用的是 g++ 编译器。 你好_fn.cpp #include #include "hello.h" void hel
我是一名优秀的程序员,十分优秀!