如何使用ctypes从C函数返回对象?
发布时间:2020-12-16 09:47:56 所属栏目:百科 来源:网络整理
导读:我有两个C类,Container和Item,看起来像: 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::vectorItem* ite
我有两个C类,Container和Item,看起来像:
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) 我在documentation中读到了restype和argtype,但我显然遗漏了一些东西,我怎么能让Container.getItem在Python中返回一个Item? 解决方法
将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 = () 然后,你会得到你想要的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |