Ich schreibe eine High-Level-Schnittstelle für eine C-Bibliothek für Python mit Cython.
Ich habe eine Erweiterung Typ A
, die die Bibliothek mit einem Zeiger auf eine komplexere C-Kontextstruktur c_context
initialisiert. Der Zeiger wird in A
gespeichert.
A
hat auch eine def
Funktion, die wiederum eine andere Erweiterung Typ B
Initialisierung einer anderen C-Struktur mit einer Bibliothek Funktionsaufruf erstellt. Diese Struktur wird für die nachfolgenden Bibliotheksaufrufe in B
benötigt.
B
braucht die c_context
Zeiger von A
, die von mir in der Verlängerung Typ py_context
um es B
-__cinit__
zu passieren gewickelt ist:Wie schreibe ich einen vollständigen Python-Wrapper um ein C-Struct mit Cython?
#lib.pxd (C library definitions)
cdef extern from "lib.h":
ctypedef struct c_context:
pass
#file py_context.pxd
from lib cimport c_context
cdef class py_context:
cdef c_context *context
cdef create(cls, c_context *context)
cdef c_context* get(self)
#file py_context.pyx
def class py_context:
@staticmethod
cdef create(cls, c_context *c):
cls = py_nfc_context()
cls.context = c
return cls
cdef c_context* get(self):
return self.context
die Wrapper Pass mit dem richtigen C Kontext funktioniert perfekt.
Jetzt muss ich die C-Struktur aus py_context
wieder und speichern Sie es in B
. Ich fügte cdef c_context get(self)
zu py_context.pxd/pyx
hinzu. py_context.get()
von Bs Aufruf __cinit__
Ergebnisse in: AttributeError: py_context object has no attribute get.
Es scheint, wie ich meinen Kopf nicht um, wenn cdef
Funktionen in Cython nennen.
Also meine Frage ist: Was ist der beste Weg, um die C-Struktur wieder aus meiner Wrapper-Klasse zu extrahieren?
Haben Sie das gelesen? http://docs.cython.org/src/tutorial/clibraries.html – chrisb