Сопоставление глобальной переменной из общей библиотеки с помощью ctypes
Вопрос
Я хотел бы сопоставить значение int pbs_errno
объявлен как глобальный в библиотеке libtorque.so
используя ctypes.
В настоящее время я могу загрузить библиотеку следующим образом:
from ctypes import *
libtorque = CDLL("libtorque.so")
и успешно сопоставили кучу функций.Однако в целях проверки ошибок многие из них устанавливают pbs_errno
переменная, поэтому мне тоже нужен доступ к ней.Однако, если я попытаюсь получить к нему доступ, я получу:
>>> pytorque.libtorque.pbs_errno
<_FuncPtr object at 0x9fc690>
Конечно, это не указатель на функцию, и попытка вызвать его приводит к ошибке сегмента.
Это объявлено как int pbs_errno;
в главном заголовке и extern int pbs_errno;
в файлах заголовков API.
Objdump показывает символ как:
00000000001294f8 g DO .bss 0000000000000004 Base pbs_errno
Решение
В документации ctypes есть раздел о доступе к значениям, экспортированным в dll:
http://docs.python.org/library/ctypes.html#accessing-values-exported-from-dlls
например
def pbs_errno(): return c_int.in_dll(libtorque, "pbs_errno")