Wrapping / Casting C-Struktur in Cython-Python-Klasse

Ich fange gerade an, mich mit Cython vertraut zu machen und versuche, einige Strukturen von einer C-Bibliothek zu Python-Methoden und Klassen zu verpacken. Was ich nicht wirklich verstehe, ist, wie das Gießen von (initialisierten) C-Strukturen in die entsprechende Python-Klasse funktionieren sollte. Was fehlt mir hier

Ein Snippet aus der C-Header-Datei:

struct test_struct { int _something; complex_struct* _another; }; typedef struct test_struct test; test *test_new(void); int some_method(test **n, int irrelevant); 

Entsprechendes Snippet von meinem .pxd:

 cdef struct test_struct: pass ctypedef test_struct test test* test_new() int some_method(test **n, int irrelevant) 

Mein .pyx:

 def do_something(int irrelevant): cdef test* t = test_new() ret = some_method(&t, irrelevant) # Here comes the problem... return <Test?>t cdef class Test: cdef test* _t # cinit here and some methods here. No members except _t 

Alles bis zur return-Anweisung funktioniert gut. Ich bekomme einen korrekten Wert in ret , etc. Aber die Besetzung in der return-Anweisung scheint falsch zu sein oder es fehlt mehr Informationen. Bei der Ausgabe von t = do_something(42) Python segfaults.

Der segfault selbst ist überhaupt nicht hilfreich:

 Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7a9e74b in internal_print () from /usr/lib/libpython2.7.so.1.0 (gdb) bt #0 0x00007ffff7a9e74b in internal_print () from /usr/lib/libpython2.7.so.1.0 #1 0x00007ffff7a81adb in PyFile_WriteObject () from /usr/lib/libpython2.7.so.1.0 #2 0x00007ffff7b19acb in sys_displayhook () from /usr/lib/libpython2.7.so.1.0 #3 0x00007ffff7a64c23 in PyObject_Call () from /usr/lib/libpython2.7.so.1.0 #4 0x00007ffff7af2ff7 in PyEval_CallObjectWithKeywords () from /usr/lib/libpython2.7.so.1.0 #5 0x00007ffff7af6f3b in PyEval_EvalFrameEx () from /usr/lib/libpython2.7.so.1.0 #6 0x00007ffff7af91b0 in PyEval_EvalCodeEx () from /usr/lib/libpython2.7.so.1.0 #7 0x00007ffff7af92b2 in PyEval_EvalCode () from /usr/lib/libpython2.7.so.1.0 #8 0x00007ffff7b11f9f in run_mod () from /usr/lib/libpython2.7.so.1.0 #9 0x00007ffff7b13ec0 in PyRun_InteractiveOneFlags () from /usr/lib/libpython2.7.so.1.0 #10 0x00007ffff7b140ae in PyRun_InteractiveLoopFlags () from /usr/lib/libpython2.7.so.1.0 #11 0x00007ffff7b1470e in PyRun_AnyFileExFlags () from /usr/lib/libpython2.7.so.1.0 #12 0x00007ffff7b24bcf in Py_Main () from /usr/lib/libpython2.7.so.1.0 #13 0x00007ffff746f000 in __libc_start_main () from /usr/lib/libc.so.6 #14 0x000000000040073e in _start () 

Wie Sie sehen können, sollte die do_something Methode ein Python-Objekt vom Typ Test zurückgeben. Was muss ich hinzufügen, um die Besetzung erfolgreich zu machen? Muss ich die Struktur der Python-Klasse manuell abbilden? Gibt es irgendeine Cythonmagie, die ich benutzen kann?

One Solution collect form web for “Wrapping / Casting C-Struktur in Cython-Python-Klasse”

Sie müssen Test in eine tatsächliche Wrapper um den C-Typ machen. Aber du kannst auch kein C-Argument an eine Python-Funktion übergeben (wie zB einen Konstruktor). Also brauchst du auch eine werksstellung. Hier ist ein Beispiel:

 cdef class Test: cdef test* _t def __cinit__(self): self._t = NULL def _setup(self, test* t): self._t = t return self property something: def __get__(self): return self._t._something def __set__(self, int val): self._t._something = val cdef Test_create(test* t): return Test()._setup(t) 

Dann in do_something() :

 return Test_create(t) 
  • Neugieriger Segfault bei Verwendung von Python CTypes Union mit 4 Strukturen aber nicht weniger
  • Strukturdefinition mit typisierte Speicheransicht als Mitglied
  • Python, wie man Daten in einem in einer Liste gespeicherten namedtuple bearbeiten kann?
  • Python struct.unpack Fehler mit TypeError: ein Bytes-ähnliches Objekt ist erforderlich, nicht 'str'
  • Python, wie zu decodieren Binär codiert Dezimal (BCD)
  • Python-Klasse-Fabrik, um einfache strukturelle Klassen zu produzieren
  • Übergeben von struct mit Zeigermitgliedern an den OpenCL-Kernel mit PyOpenCL
  • Konvertieren von Ctypes-Code zu Zython
  • Python Memory Leak mit Struct und Numpy
  • Beizen eines Python-Erweiterungstyps, der als C-Struktur mit PyObject-Mitgliedern definiert ist
  • Packung 4 Integers als ONE BYTE?
  • Python ist die beste Programmiersprache der Welt.