2009-02-13 2 views
12

Ich möchte einen Int-Wert pbs_errno als eine globale in der Bibliothek libtorque.so mit Ctypes deklariert.Mapping einer globalen Variablen aus einer gemeinsam genutzten Bibliothek mit Ctypes

Zur Zeit kann ich die Bibliothek wie so laden:

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

und haben erfolgreich eine Reihe von Funktionen abgebildet. Zur Fehlerüberprüfung setzen viele von ihnen jedoch die pbs_errno Variable, so dass ich auch darauf zugreifen muss. Allerdings, wenn ich versuche, darauf zuzugreifen, erhalte ich:

>>> pytorque.libtorque.pbs_errno 
<_FuncPtr object at 0x9fc690> 

Natürlich ist es nicht ein Funktionszeiger und versucht, sie in einem seg Fehler führen zu nennen.

Es ist als int pbs_errno; im Hauptheader und extern int pbs_errno; in den API-Header-Dateien deklariert.

objdump zeigt das Symbol als:

00000000001294f8 g DO .bss 0000000000000004 Base  pbs_errno 
+0

Johns Antwort ist korrekt. Das Festlegen des Resttyps ändert nur den Rückgabetyp der Funktion AFAICT. Wenn ich tatsächlich pbs_errno als Funktion aufrufen wollte, führte dies zu einem segfault. –

Antwort

16

Es gibt einen Abschnitt in dem ctypes docs etwa in DLLs Zugriff auf exportierte Werte:

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

z.B.

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

Danke. Irgendwie habe ich diesen Bereich bei der Verwendung der Dokumente übersehen. Es ist ein großes Handbuch mit vielen verschiedenen Inhalten, leicht zu überblicken und nicht zu bemerken: / –

Verwandte Themen