Zugriff auf libc-Funktionen über ctypes

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Benutzeravatar
flix
User
Beiträge: 9
Registriert: Freitag 11. März 2005, 18:21
Wohnort: Freiburg

Ich will mittels ctypes Funktionen aus der Linux libc aufrufen. Ich hab' das gerade in einem Buch gelesen und finde die Idee ziemlich spannend. Nur leider funktionieren die Codebeispiele bei mir nicht.

Ich habe folgendes probiert:

Code: Alles auswählen

from ctypes import *
libc = cdll.LoadLibrary("libc.so")
Das soll mir ein Handle auf die libc geben, so dass ich die dort definierten Funktionen direkt aufrufen kann. Nur leider passiert Folgendes:

Code: Alles auswählen

>>> from ctypes import *
>>> libc = cdll.LoadLibrary("libc.so")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/ctypes/__init__.py", line 431, in LoadLibrary
    return self._dlltype(name)
  File "/usr/lib/python2.6/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /usr/lib/libc.so: invalid ELF header
Liegt das an dem 32/64-Bit Gedöns?
Mein System ist ein 64-bit Ubuntu 9.04
(2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 x86_64 GNU/Linux)

Hat jemand eine Ahnung wie ich diese Bibliothek laden kann?
Benutzeravatar
snafu
User
Beiträge: 6737
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

>>> from ctypes import CDLL
>>> from ctypes.util import find_library
>>> CDLL(find_library('c'))
<CDLL 'libc.so.6', handle b77dc7f8 at b7792b0c>
Benutzeravatar
flix
User
Beiträge: 9
Registriert: Freitag 11. März 2005, 18:21
Wohnort: Freiburg

Super, vielen Dank!!!

Wenn ich gewusst hätte, dass ich die libc.so.6 laden muss, hätte ich gleich danach gegrept. Mit cdll.LoadLibrary('/lib/libc.so.6') hat es dann nämlich auch direkt geklappt.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

find_library hat halt den Vorteil, dass du keinen festen Pfad verwendest (sollte die Lib unter /usr/lib liegen etc.)
Benutzeravatar
snafu
User
Beiträge: 6737
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Auch ich würde zu `find_library()` tendieren, wenn das Skript auf möglichst vielen Plattformen laufen soll. Nur bei Windows soll es Schwierigkeiten bei der Namensfindung geben, wobei ab Python 2.6 zumindest mit den gängien Bibliotheken `libc` und `libm` besser umgegangen wird:
Changed in version 2.6: Windows only: find_library("m") or find_library("c") return the result of a call to find_msvcrt().
Für alle anderen Fälle gilt leider:
On Windows, find_library() searches along the system search path, and returns the full pathname, but since there is no predefined naming scheme a call like find_library("c") will fail and return None.
Mit `libc` trifft das aber wie gesagt nicht mehr zu.
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

snafu hat geschrieben:

Code: Alles auswählen

>>> from ctypes import CDLL
>>> from ctypes.util import find_library
>>> CDLL(find_library('c'))
<CDLL 'libc.so.6', handle b77dc7f8 at b7792b0c>
Danke. Das muss ich mir merken!
Antworten