gpt4 book ai didi

c++ - Python ctypes : wraping c++ class with operators

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:50 26 4
gpt4 key购买 nike

我想使用 ctypes 包装一个小的测试 C++ 类以在 python 中使用。该类称为 Edge 并具有友元比较 (==) 运算符。我很难在包装器 python 代码中实现比较功能。

一个简洁的 Edge header 是:

class Edge {
private:
int p1, p2;
public:
Edge(const int pp1, const int pp2);
~Edge(){};
friend bool operator==(const Edge &e1, const Edge &e2);
};

我写的python wrapper是:

from ctypes import *
lib = cdll.LoadLibrary('./libedge.so')

lib.Edge_new.argtypes = [c_int, c_int]
lib.Edge_new.restype = c_void_p

lib.compare_edge.argtypes = [c_void_p, c_void_p]
lib.compare_edge.restype = c_bool


class Edge(object):
def __init__(self, pp1, pp2):
self.obj = lib.Edge_new(c_int(pp1), c_int(pp2))

def __eq__(self, other):
return lib.compare_edge(self.obj, c_void_p(other))

其中,Edge_new 和 compare_edge 是 C++ 例程,定义为:

#include "Edge.hpp"

extern "C" {
Edge* Edge_new(const Int32 pp1, const Int32 pp2) { return new Edge(pp1, pp2); }

bool compare_edge(Edge *e1, Edge *e2) {
return *e1 == *e2;
}
}

构造函数工作正常。当我比较两个边缘对象时 e1 == e2 我得到以下类型错误:

Traceback (most recent call last):   File "Edge.py", line 21, in <module>
print e1 == e2 File "Edge.py", line 16, in __eq__
return lib.compare_edge(self.obj, c_void_p(other)) TypeError: cannot be converted to pointer

我确实理解该错误的含义,也很可能理解出错的原因,但我不知道如何解决。我正在用 gcc 4.7 编译 C++ 代码,python 解释器是 64 位的。

最佳答案

问题是,您正试图将 Python 对象转换为 void * , 而不是 void *您已经附加到该对象的 obj属性。

它应该像改变...一样简单

def __eq__(self, other):
return lib.compare_edge(self.obj, c_void_p(other))

...到...

def __eq__(self, other):
return lib.compare_edge(self.obj, other.obj)

显式调用 c_void_p应该是不必要的,因为您已经在行中声明了类型...

lib.compare_edge.argtypes = [c_void_p, c_void_p]

关于c++ - Python ctypes : wraping c++ class with operators,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17244756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com