2009-05-15 13 views
5

Sto cercando di creare un wrapper per FLAC, in modo da poter utilizzare FLAC nel mio codice Python.Creazione di un wrapper per una libreria C in Python

Ho provato a utilizzare prima i ctypes, ma ha mostrato un'interfaccia davvero strana alla libreria, ad es. tutte le funzioni di init per FLAC stream e file sono diventate una funzione senza informazioni reali su come inizializzarla. Soprattutto perché vuole un riferimento a un decodificatore di stream, ma Python non ha modo di memorizzare puntatori (BZZZT!), e quindi non posso memorizzare il puntatore al decodificatore di flusso. Non aiuta che le diverse funzioni di init abbiano un diverso numero di argomenti e alcuni tipi di argomenti differiscano. Ha anche un sacco di enumerazioni e strutture, e non so come ottenerle nel mio codice.

Ho cercato Pyrex, ma mi sono imbattuto nello stesso problema con i puntatori, ma penso di averlo risolto, in qualche modo. The file isn't small either, and it's not even complete.

Quindi sto cercando alternative o guide che mi aiutino a capire meglio i modi sopra citati. Sarebbe davvero d'aiuto se potessi ricevere una raccomandazione e/o aiuto.

risposta

5

Hai avuto uno sguardo al http://www.swig.org/:

SWIG è uno strumento di sviluppo software che collega i programmi scritti in C e C++ con una varietà di alto livello linguaggi di programmazione.

10

Python non ha alcun modo per memorizzare i puntatori, e quindi non in grado di memorizzare il puntatore al decoder flusso

ctypes ha puntatori, e ctypes può essere utilizzato per avvolgere C esistenti librerie. Solo un suggerimento, dovrai avvolgere/riscrivere tutte le strutture relavent C in ctypes.Structure. Dai un'occhiata agli esempi: code.google.com/p/pyxlib-ctypes e code.google.com/p/pycairo-ctypes. Maggiori informazioni come mappare la funzione/procedura e le sue argtypes e restype a http://docs.python.org/library/ctypes.html

Ho cercato in Pyrex, ma ho un pò incontrato lo stesso problema con i puntatori, ma penso che ho risolto , una specie di. Anche il file non è piccolo e non è nemmeno completo.

Cython può essere quello che vi serve se volete la sintassi pulita. www.cython.org

Quindi sto cercando alternative, o guide che mi aiutino a capire meglio i modi di cui sopra. Sarebbe davvero d'aiuto se potessi ricevere una raccomandazione e/o aiuto.

sorso su altra parte può sempre essere usato, ma è più complicato, se non siete abituati ad esso. www.swig.org

0

Alcune persone usano pyrex per questo.

+0

Cython si basa sul ben noto Pyrex, ma supporta funzionalità e ottimizzazioni più avanzate. – mtasic85

4

ma Python non ha modo di memorizzare puntatori (BZZZT!)

Che non è corretto. Si crea un puntatore come questo:

pInt = POINTER(c_int)() 

e si accede in questo modo

pInt[0] # or p.contents 
2

Questo post è vecchio, ma non c'è alternativa al ctypes: CFFI. È molto più semplice, un po 'più veloce e funziona meglio con PyPy. Inoltre, ha un grande supporto per i puntatori. Ecco un esempio:

from cffi import FFI 

ffi = cffi.FFI() 

ffi.cdef(''' 
struct x { void *a; } 

void* get_buffer(); 
struct x* make_x(void*); 
void change_x(struct x*, void*); 
''') 

dll = ffi.dlopen('libmyawesomelibrary.so') 

buf = dll.get_buffer() 
tst = dll.new('struct x*') 
tst.a = buf 
change_x(tst, get_buffer()) 
tst2 = make_x(get_buffer()) 
Problemi correlati