2009-02-13 13 views
12

Chciałbym odwzorować wartość int pbs_errno zadeklarowaną jako globalna w bibliotece libtorque.so przy użyciu ctypes.Mapowanie zmiennej globalnej z biblioteki współużytkowanej z ctypami

Obecnie mogę załadować biblioteki tak:

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

i pomyślnie mapowane kilka funkcji. Jednak dla celów sprawdzania błędów wielu z nich ustawi zmienną pbs_errno, więc potrzebuję również dostępu do tej zmiennej. Jednak gdy próbuję uzyskać do niego dostęp uzyskać:

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

Oczywiście, nie jest to wskaźnik funkcji i próbują nazwać to skutkuje winy seg.

Jest zadeklarowany jako int pbs_errno; w nagłówku głównym i extern int pbs_errno; w plikach nagłówkowych interfejsu API.

objdump pokazuje symbol jako:

00000000001294f8 g DO .bss 0000000000000004 Base  pbs_errno 
+0

Odpowiedź Johna jest prawidłowa. Ustawienie typu restykcji zmienia tylko typ zwracanej funkcji, AFAICT. Gdybym rzeczywiście próbował wywołać funkcję pbs_errno jako funkcję, to skutkowałby ona uszkodzeniem. –

Odpowiedz

16

tam przekrój w ctypes Dokumenty o dostępie wartości eksportowane w DLL:

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

np

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

Dzięki. Jakoś tęskniłem za tą sekcją podczas korzystania z dokumentów. Jest to duży podręcznik z mnóstwem różnych treści, łatwy do zerknięcia i niezauważenia: / –

Powiązane problemy