Mapeamento de uma variável global a partir de uma biblioteca compartilhada com ctypes

StackOverflow https://stackoverflow.com/questions/544173

  •  23-08-2019
  •  | 
  •  

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
Foi útil?

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")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top