2009-05-15 21 views
5

Estoy tratando de crear un contenedor propio para FLAC, para que pueda usar FLAC en mi propio código Python.Crear un contenedor para una biblioteca C en Python

Intenté usar ctypes primero, pero mostraba una interfaz realmente extraña para la biblioteca, p. todas las funciones init para flujos y archivos FLAC se convirtieron en una función sin información real sobre cómo inicializarla. Especialmente porque quiere una referencia a un decodificador de flujo, pero Python no tiene forma de almacenar punteros (BZZZT!) y, por lo tanto, no puedo almacenar el puntero al decodificador de flujo. No ayuda que las diferentes funciones init tengan un número diferente de argumentos y que algunos tipos de argumentos difieran. También tiene muchas enumeraciones y estructuras, y no sé cómo incluirlas en mi código.

He estado buscando en Pyrex, pero me encontré con el mismo problema con los punteros, pero creo que lo resolví, de alguna manera. The file isn't small either, and it's not even complete.

Así que estoy buscando alternativas, o guías que me ayuden a entender mejor las formas antes mencionadas. Sería de gran ayuda si pudiera obtener una recomendación y/o ayuda.

Respuesta

5

¿Tuvo un vistazo a http://www.swig.org/:

TRAGO es una herramienta de desarrollo de software que conecta los programas escritos en C y C++ con una variedad de alto nivel lenguajes de programación.

10

Python no tiene manera de almacenar punteros, y por lo tanto no puede almacenar el puntero al decodificador corriente

ctypes tiene punteros, y ctypes se puede utilizar para envolver C existente bibliotecas. Solo un consejo, tendrás que envolver/reescribir todas las estructuras C relavantes en ctypes.Structure. Observe los ejemplos: code.google.com/p/pyxlib-ctypes y code.google.com/p/pycairo-ctypes. Más información de cómo asignar la función/procedimiento y sus argtypes y restype en http://docs.python.org/library/ctypes.html

He estado buscando en Pyrex, pero poco se encontró con el mismo problema con los punteros, pero creo que lo resolví , tipo de. El archivo tampoco es pequeño y ni siquiera está completo.

Cython puede ser lo que usted necesita si quiere sintaxis limpia. www.cython.org

Así que estoy buscando alternativas, o guías que me ayuden a comprender mejor las formas antes mencionadas. Sería de gran ayuda si pudiera obtener una recomendación y/o ayuda.

trago en otra parte siempre se puede utilizar, pero es más complicado si usted no está acostumbrado a ella. www.swig.org

0

Algunas personas usan pyrex para esto.

+0

Cython se basa en el conocido Pyrex, pero admite más funciones y optimizaciones de vanguardia. – mtasic85

4

pero Python no tiene manera de almacenar punteros (BZZZT!)

Eso es incorrecto. Se crea un puntero de la siguiente manera:

pInt = POINTER(c_int)() 

y se accede a él como esto

pInt[0] # or p.contents 
2

Este post es viejo, pero no hay una alternativa a ctypes: CFFI. Es mucho más fácil, algo más rápido y funciona mejor bajo PyPy. Además, tiene un gran soporte para punteros. Aquí hay un ejemplo:

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()) 
Cuestiones relacionadas