Sto scrivendo un'interfaccia di alto livello per una libreria C per Python che usa Cython.
Ho un'estensione Tipo A
che inizializza la libreria con un puntatore a una struttura di contesto C più complessa c_context
. Il puntatore viene salvato in A
.
A
ha anche una funzione def
che a sua volta crea un'altra estensione Tipo B
inizializzando un'altra struttura C con una chiamata di funzione di libreria. Questa struttura è necessaria per le successive chiamate di libreria effettuate in B
.
B
bisogno il puntatore c_context
da A
che è avvolto da me entro il tipo di estensione py_context
per passare alla __cinit__
da B
:Come scrivere un wrapper Python completo attorno a C Struct usando 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
Passando l'involucro con il contesto C corretto funziona perfettamente.
Ora devo rimuovere di nuovo la struttura C da py_context
e salvarla in B
. Ho aggiunto cdef c_context get(self)
a py_context.pxd/pyx
. Chiamata py_context.get()
da Bs __cinit__
risultati in: AttributeError: py_context object has no attribute get.
sembra che non ho ricevuto la mia testa intorno quando chiamare cdef
funzioni Cython.
Quindi la mia domanda è: Qual è il modo migliore per estrarre di nuovo la struct C dalla mia classe wrapper?
Hai letto questo? http://docs.cython.org/src/tutorial/clibraries.html – chrisb