Ich versuche, eine Cython-Klasse in eine C++ - Klasse einzubetten. Das Erstellen eines Cython-Wrappers für diese C++ - Klasse ist aufgrund der Einschränkungen des Projekts nicht möglich. Und aufgrund der Anzahl der Methoden in den Cython-Klassen und der langen Vererbungen der Cython-Klassen ist das vollständige Entfernen der Methode aus einer Klasse keine attraktive Lösung. Ich muss eine Cython-Klasseninstanz erstellen und ihre Methode aus C++ aufrufen. Jedoch kann ich nicht scheinen, es nicht segfault zu machen. Hier ist ein Beispiel für das Problem:Einbetten von Cython-Klassenmethoden in C++
< < < Datei: fooClass.pyx >>>
from math import sin
cdef public class Foo[object Foo, type fooType]:
cdef double a,b
def __cinit__(self, double a, double b):
self.a = a
self.b = b
cdef double bar(self, double c):
return sin(self.a*c)
cdef api double foobar(Foo foo, double d):
return foo.bar(d)
< < < Datei: foo.cpp >>>
#include "fooClass_api.h"
#include <iostream>
int main(){
Py_Initialize();
import_fooClass();
Foo foo;
foo.a = 1.0;
foo.b = 10.0;
std::cout << foobar(&foo,5.0) << "\n";
Py_Finalize();
}
< < < Datei: setup.py >>>
from distutils.core import setup
from Cython.Build import cythonize
setup (ext_modules = cythonize ("cyClass.pyx"))
Ich baue mit python setup.py build_ext --inplace
und kompilieren mit g ++. Durch Tests weiß ich, dass Py_Initialize()
und import_fooClass
erfolgreich ist. Und ich weiß, dass ich die Werte von foo.a
und foo.b
innerhalb von foobar()
drucken, aber sobald ich einen Anruf mit dem Foo
Objekt innerhalb foobar()
, das Programm segfaults machen. Selbst ein Anruf an foo.__dict__
oder foo.callable()
innerhalb foobar()
verursacht es zu segfault. Ändern der public
oder api
Schlüsselwörter haben Wirkung gehabt, noch hat das Umschalten zwischen __init__
und __cinit__
. Wenn jemand weiß, wie das zu beheben ist, würde ich sehr dankbar sein. Ich vermute, dass es etwas mit Zeigern zu tun hat oder die Python C API missbraucht. Vielen Dank!
In Teil es ist, weil Sie nicht 'foo' sind Initialisierung - es hat einen Zeiger namens ' VTAB 'was zB nie gesetzt ist (siehe" FooClass.h "). Ich denke, du brauchst eine Capi-Funktion, die ein 'Foo' zurückgibt. Aber das wird den Segmentierungsfehler für mich immer noch nicht los und ich kann nicht sofort sehen, was nötig ist, um ihn zu reparieren ... –
DavidW