2009-02-13 14 views
12

Me gustaría asignar un valor int pbs_errno declarado como global en la biblioteca libtorque.so utilizando ctypes.Asignación de una variable global desde una biblioteca compartida con ctypes

Actualmente puedo cargar la biblioteca de este modo:

from ctypes import * 
libtorque = CDLL("libtorque.so") 

y ha identificado con éxito un montón de las funciones. Sin embargo, para el control de errores, muchos de ellos configuraron la variable pbs_errno, así que también necesito acceder a ella. 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 el encabezado principal y extern int pbs_errno; en los archivos de encabezado de API.

objdump muestra el símbolo como:

00000000001294f8 g DO .bss 0000000000000004 Base  pbs_errno 
+0

La respuesta de John es correcta. Configurar el restype solo cambia el tipo de retorno de la función, AFAICT. Si realmente intenté llamar a pbs_errno como una función, resultó en una segfault. –

Respuesta

16

Hay una sección en la documentación ctypes sobre cómo acceder a los valores exportados en dlls:

http://docs.python.org/library/ctypes.html#accessing-values-exported-from-dlls

por ejemplo

 
def pbs_errno(): 
    return c_int.in_dll(libtorque, "pbs_errno") 
+0

Gracias. De alguna manera me perdí esa sección cuando uso los documentos. Es un gran manual con una tonelada de contenido variable, fácil de revisar y no notar: / –

Cuestiones relacionadas