La cartographie d'une variable globale à partir d'une bibliothèque partagée avec ctypes
Question
Je voudrais mapper une valeur int pbs_errno
déclarée comme globale dans la bibliothèque libtorque.so
en utilisant ctypes.
À l'heure actuelle, je peux charger la bibliothèque comme ceci:
from ctypes import *
libtorque = CDLL("libtorque.so")
et dresser la carte avec succès un tas de fonctions. Toutefois, à des fins de vérification d'erreur beaucoup d'entre eux définissez la variable d'pbs_errno
donc je besoin d'accéder à cela aussi. Toutefois, si je tente d'y accéder, je reçois:
>>> pytorque.libtorque.pbs_errno
<_FuncPtr object at 0x9fc690>
Bien sûr, ce n'est pas un pointeur de fonction et d'essayer d'appeler il en résulte un défaut de seg.
Il est déclaré comme int pbs_errno;
dans l'en-tête principal et extern int pbs_errno;
dans les fichiers d'en-tête API.
objdump montre le symbole comme:
00000000001294f8 g DO .bss 0000000000000004 Base pbs_errno
La solution
Il y a une section dans les ctypes docs sur l'accès aux valeurs exportées en dll:
http://docs.python.org/ bibliothèque / ctypes.html #-valeurs Accéder exportées-de-dll
par exemple.
def pbs_errno(): return c_int.in_dll(libtorque, "pbs_errno")