Mapeamento de uma variável global a partir de uma biblioteca compartilhada com ctypes
Pergunta
Eu gostaria de mapear um pbs_errno
valor int declarado como um global no libtorque.so
biblioteca usando ctypes.
Atualmente eu posso carregar a biblioteca assim:
from ctypes import *
libtorque = CDLL("libtorque.so")
e ter mapeado com sucesso um monte de funções. No entanto, para fins de verificação de erros muitos deles definir a variável pbs_errno
então eu preciso de acesso a esse bem. No entanto, se eu tentar acessá-lo eu recebo:
>>> pytorque.libtorque.pbs_errno
<_FuncPtr object at 0x9fc690>
É claro, não é um ponteiro de função e tentar chamá-lo resulta em uma falha seg.
É declarada como int pbs_errno;
no cabeçalho principal e extern int pbs_errno;
nos arquivos de cabeçalho API.
mostra objdump o símbolo como:
00000000001294f8 g DO .bss 0000000000000004 Base pbs_errno
Solução
Há uma seção no ctypes docs sobre como acessar valores exportados em DLLs:
http://docs.python.org/ biblioteca / ctypes.html # Acessando valores-exportados-de-dlls
por exemplo.
def pbs_errno(): return c_int.in_dll(libtorque, "pbs_errno")