Python ctypes:用运算符包装c ++类

我想用ctypes包装一个小的测试C ++类,用于python。 该类称为Edge并具有朋友比较(==)运算符。 我在包装python代码中实现比较function有困难。

简洁的Edge标题是:

 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包装器是:

 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  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 * ,而不是已经附加到该对象的obj属性的void *

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

 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]