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

Angel Guzman Maeso shakaran en gmail.com
Sab Oct 9 14:37:22 ART 2010


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

En la documentación oficial:
http://docs.python.org/library/ctypes.html#accessing-values-exported-from-dlls
solo se muestra un pequeño ejemplo para acceder a una constante, pero es de
la propia python C api y no he sabido trasladar el ejemplo o como usarlo
para otra biblioteca.

Este es mi código de ejemplo (tambien en pastebin:
http://pastebin.com/zcmtQ4G6 ):
#!/usr/bin/python

import sys

try:
    from ctypes import CDLL, pythonapi, c_int, POINTER, c_char_p, byref,
RTLD_GLOBAL
    from ctypes.util import find_library
except ImportError:
    print 'ERROR! La libreria *ctypes* para Python no esta disponible!'
    sys.exit(-1)

libc = CDLL('libc.so.6')

print libc._handle, libc._name

f = pythonapi.Py_GetArgcArgv
argc = c_int()
argv = POINTER(c_char_p)()
f(byref(argc), byref(argv))

mpi = CDLL(find_library('mpi'), RTLD_GLOBAL)
print mpi._handle, mpi._name

myrank = c_int();
nprocs = c_int();

opt_flag = c_int.in_dll(pythonapi, "MPI_COMM_WORLD") # Aqui falla al acceder
a MPI_COMM_WORLD

#mpi.MPI_Comm_size(mpi.MPI_COMM_WORLD, byref(nprocs)); # Lo necesito aqui,
pero no funciona MPI_COMM_WORLD

libc.printf("Hello from processor %d of %d\n", myrank, nprocs);

mpi.MPI_Finalize()

--------

En teoria se accede con el método in_dll() pero no consigo extraer el valor
y me falla con un:
Traceback (most recent call last):
  File "memory.py", line 36, in <module>
    opt_flag = c_int.in_dll(pythonapi, "MPI_COMM_WORLD")
ValueError: python: undefined symbol: MPI_COMM_WORLD

Espero vuestra ayuda.

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/d462c34f/attachment.html>


More information about the pyar mailing list