加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用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 = ()

然后,你会得到你想要的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读