Я хочу обернуть небольшой тестовый класс C ++ для использования в Python с использованием ctypes. Класс называется Edge
и имеет оператор сравнения друзей (==). У меня возникают трудности с реализацией функции сравнения в коде Python-обертки.
Сжатый 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_boolclass 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
Я понимаю, что означает ошибка, и, скорее всего, почему что-то идет не так, но я не знаю, как это исправить. Я компилирую код C ++ с помощью gcc 4.7, и интерпретатор 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]
Других решений пока нет …