доступ к членам класса ctypes

Я заинтересован в использовании класса C ++ в Python. Смотря на Вызов C / C ++ из Python?, Я решил попробовать ctypes. Тем не менее, я получаю segfault, когда я пытаюсь изменить значение члена класса.

Вот простой пример, который воспроизводит мою проблему:

Сторона C / C ++:

#include <iostream>

class Foo{
private:
int mValue;
public:
void bar(){
std::cout << "Hello" << std::endl;
}
void setValue(int inValue) {
mValue = inValue;
std::cout << "Value is now: " << mValue << std::endl;
}
void setValue2() {
mValue = 2;
std::cout << "Value is now: " << mValue << std::endl;
}
};

extern "C" {
Foo* Foo_new(){ return new Foo(); }
void Foo_bar(Foo* foo){ foo->bar(); }
void Foo_setValue(Foo* foo, int v) { foo->setValue(v); }
void Foo_setValue2(Foo* foo) { foo->setValue2(); }
}

Код компилируется на OSX с:

g++ -c -fPIC foo.cpp -o foo.o && g++ -shared -Wl -o libfoo.dylib  foo.o

Сторона питона:

from ctypes import *
lib = cdll.LoadLibrary('./libfoo.dylib')

class Foo(object):
def __init__(self):
self.obj = lib.Foo_new()
def bar(self):
lib.Foo_bar(self.obj)
def set(self, v):
lib.Foo_setValue(self.obj, v);
def set2(self):
lib.Foo_setValue2(self.obj);

Я могу вызвать bar без проблем, но я получаю segfault, если я вызываю set или set2.

f = Foo()
f.bar()  # Ok
f.set(3) # Segfault

Очевидно, я что-то упустил.

4

Решение

Использование следующего решило проблему:

def __init__(self):
lib.Foo_new.restype = c_void_p # Needed
self.obj = lib.Foo_new()

def set(self, v):
lib.Foo_setValue(c_void_p(self.obj), v) # c_void_p needed

Читая вокруг, кажется, проблема с 64-битным указателем.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector