[pyar] Acceder a constantes de bibliotecas C con Python usando ctypes

Angel Guzman Maeso shakaran en gmail.com
Sab Oct 9 17:04:59 ART 2010


El 9 de octubre de 2010 20:23, Daniel Moisset <dmoisset en machinalis.com>escribió:

> 2010/10/9 Angel Guzman Maeso <shakaran en gmail.com>:
> > Hola lista,
> >
> > Estoy trasteando un poco con la biblioteca ctypes para usar bibliotecas
> > compartidas escritas en C desde Python.
> >
> > No he tenido problemas hasta ahora para usarla, salvo cuando necesito
> > acceder a constantes que posea la biblioteca.
> >
> > Por ejemplo, usando la biblioteca de MPI en C (ya se que existen
> > implementaciones en python, pero quiero utilizarla nativamente) necesito
> > acceder a
> > una constanet llamada MPI_COMM_WORLD
>
> El problema que estas teniendo es que la constante no esta dentro de
> la biblioteca compilada, sino que solo esta definida como un macro en
> el .h
>
> No hay forma que ctypes la encuentre, porque ctypes abre el binario
> (.so o .dll), y la constante no esta ahi.
>
> Hay dos formas de resolver ese caso:
>
> a) hacerte vos un modulo python mpi_constants.py donde definas a mano
> MPI_COMM_WORLD=9876 (buscando el valor correcto en el .h de MPI). Vi
> que hay por ahi algunos scripts que agarran un .h y te generan el .py
> automaticamente, nunca los probe
>
> b) Hacete un modulo en C vos que diga algo como:
>
> #include <algunacosa.h>
>
> const int mpi_comm_world = MPI_COMM_WORLD;
> /* El resto de las constantes que quieras */
>
> Ese .c lo podes compilar y ahi si vas a tener las variables
> globales(en el ejempl: mpi_comm_world) accesibles, porque son
> variables y no macros.
>
> La desventaja de (b) es que tenes que compilar (en C) una cosa mas, y
> si estas distribuyendo tu soft, puede ser un perno extra para el
> usuario. La ventaja es que no tenes que buscar valores de variables, y
> que siempre te van a coincidir (incluso para constantes cuyo valor
> dependa de el SO/arquitectura/plataforma, que a veces pasa)
>
> Saludos,
>   D.
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>

Gracias Daniel, por tu rápida respuesta.

Ambas opciones creo que funcionarían. El único problema es ya dependería de
mi implementación dichos valores de la constante, por ejemplo si la
biblioteca cambiara en un futuro sus constantes tendría que ir revisando una
a una todas para que fueran compatibles.

Me extraña que no exista alguna forma de incluir por defecto las variables y
macros definidas en un archivo .h

¿como podría ver las contantes o macros que incluye dicho .so? Porque por
ejemplo tampoco tengo un mpi.VERSION y desconozco las que incluya el .so

¿o podria compilar de algun modo esta biblioteca para que incluyera dichas
constantes por defecto en el .so?

Gracias por tu respuesta. Saludos


-- 
*Blog*: www.shakaran.net
*Tivion*: un simple reproductor de canales streaming de TV
www.shakaran.net/blog/tivion
*Mi juego de rol online*: www.apogeus.es & www.apogeus.es/ao
*Hosting económico y profesiona**l*: www.quijost.com
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20101009/28232b61/attachment.html>


More information about the pyar mailing list