如何使用 ctypes 从C++函数返回对象
how do I return objects from a C++ function with ctypes?
我有两个C++类,容器和项,如下所示:
class Item{
public:
Item(std::string* name,int id);
std::string* getName();
private:
std::string* name;
int id;
};
class Container {
public:
Container();
Item* getItem(int id);
private:
std::vector<Item*> items;
};
我想在 Python 中创建和使用 Container,所以我写了一个 C 接口来编译一个共享库:
extern "C" {
Container* Container_init(){return new Container();}
Item* Container_getItem(Container* container,int id){return container->getItem(id);}
std::string* Item_getName(Item* item){return item->getName();}
}
和一个 Python 包装器:
from ctypes import *
lib = cdll.LoadLibrary(myLibPath)
class Item(object):
def getName(self):
return lib.Item_getName(self.obj)
class Container(object):
def __init__(self):
self.obj = lib.Container_init()
def getItem(self,id):
return lib.Container_getItem(self.obj,id)
lib.Container_getItem.restype = Item
lib.Container_getItem.argtypes = [c_void_p,c_int]
c = Container()
print c.getItem(5).getName()
当此代码运行时,它会在行中引发一个 TypeError "object() 不带任何参数"
return lib.Container_getItem(self.obj,id)
我在文档中阅读了有关 restype 和 argtype 的信息,但我显然缺少一些东西,如何使Container.getItem
在 Python 中返回项目?
按如下方式替换Item_getName
以返回char *
而不是string *
:
const char* Item_getName(Item* item) { return item->getName()->c_str(); }
Item
类缺少__init__
。更改如下(这是TypeError
的原因):
class Item(object):
def __init__(self, obj):
self.obj = obj
def getName(self):
return lib.Item_getName(self.obj)
并将以下内容添加到 Python 脚本(在调用getName
方法之前)以正确获取名称:
lib.Item_getName.restype = c_char_p
lib.Item_getName.argtypes = ()
然后,你会得到你想要的。
您也可以使用 cffi
.
这是一个 cffi 替代方案:
import cffi
ffi = cffi.FFI()
ffi.cdef('''
typedef struct _Item Item;
typedef struct _Container Container;
Container* Container_init();
Item* Container_getItem(Container* container,int id);
const char* Item_getName(Item* item);
''')
lib = ffi.dlopen(myLibPath)
class Item(object):
def __init__(self, obj):
self.obj = obj
def getName(self):
return lib.Item_getName(self.obj)
class Container(object):
def __init__(self):
self.obj = lib.Container_init()
def getItem(self, id):
return Item(lib.Container_getItem(self.obj, id))
c = Container()
print ffi.string(c.getItem(5).getName())
相关文章:
- 从函数返回const char*数组
- 检查函数返回类型是否与STL容器类型值相同
- 从 c 或 cpp 系列子函数返回到主函数
- 从函数返回任意简单类型的数据
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 从 C++ 中的函数返回数组地址问题
- VirtDisk.h QueryChangesVirtualDisk() 函数返回 RangeCount 为 0
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 在 c++ 中将函数返回类型指定为模板参数
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为什么向量内部的指针在从函数返回时会发生变化?
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 寿命延长从函数返回引用
- 程序不向函数返回值
- 字符串函数返回奇怪的值
- 类的大问题,以及从空函数c++返回
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- C++二叉搜索树模板从函数返回节点
- NVCC 错误:string_view.h:constexpr 函数返回是非常量