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

Daniel Moisset dmoisset en machinalis.com
Sab Oct 9 15:23:30 ART 2010


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.



More information about the pyar mailing list