Asignación de una variable global a partir de una biblioteca compartida con ctypes
Pregunta
Me gustaría asignar un valor int pbs_errno
declarada como global en el libtorque.so
biblioteca utilizando ctypes.
Actualmente puedo cargar la biblioteca de esta manera:
from ctypes import *
libtorque = CDLL("libtorque.so")
y se han asignado correctamente un montón de las funciones. Sin embargo, para fines de comprobación de errores que muchos de ellos establecer la variable pbs_errno
así que necesito acceso a eso también. Sin embargo si intento acceder a ella consigo:
>>> pytorque.libtorque.pbs_errno
<_FuncPtr object at 0x9fc690>
Por supuesto, no es un puntero de función e intentar llamar el resultado es una falla seg.
Se declara como int pbs_errno;
en la cabecera principal y extern int pbs_errno;
en los archivos de cabecera de la API.
objdump muestra el símbolo como:
00000000001294f8 g DO .bss 0000000000000004 Base pbs_errno
Solución
Hay una sección en los documentos ctypes sobre cómo acceder a los valores exportados en dlls:
http://docs.python.org/ biblioteca / ctypes.html # valores de Acceso a-exportados-de-dlls
por ejemplo.
def pbs_errno(): return c_int.in_dll(libtorque, "pbs_errno")