C-Funktionen ersetzen

29/09/2010 - 09:55 von Ole Streicher | Report spam
Hallo Gruppe,

ich habe eine von Python aufgerufene C-Funktion, die ihrerseits
Funktionen aus weiteren, dynamisch angelinkten Bibliotheken aufruft.

Jetzt möchte ich gerne einzelne Funktionen aus diesen Bibliotheken durch
Python-Calls ersetzen. Konkret: Ich habe eine Bibliothek, die mir
(neben vielem anderen) eine C-Funktion

void my_msg_info(const char *where, const char *format, ...);

implementiert und diese Funktion hàtte ich gerne durch eine eigene
Python-Implementation ersetzt.

Ist das möglich, ohne die aufgerufenen Bibliotheken zu patchen?

Viele Grüße

Ole
 

Lesen sie die antworten

#1 deets
29/09/2010 - 12:37 | Warnen spam
Ole Streicher writes:

Hallo Gruppe,

ich habe eine von Python aufgerufene C-Funktion, die ihrerseits
Funktionen aus weiteren, dynamisch angelinkten Bibliotheken aufruft.

Jetzt möchte ich gerne einzelne Funktionen aus diesen Bibliotheken durch
Python-Calls ersetzen. Konkret: Ich habe eine Bibliothek, die mir
(neben vielem anderen) eine C-Funktion

void my_msg_info(const char *where, const char *format, ...);

implementiert und diese Funktion hàtte ich gerne durch eine eigene
Python-Implementation ersetzt.

Ist das möglich, ohne die aufgerufenen Bibliotheken zu patchen?



Ich denke nicht so ohne weiteres. Du kannst Elmer benutzen,
um eine DLL/.so-Datei zu erzeugen, die intern Python verwendet.
Du kannst die dann alle Funktionen aus deiner gelinkten Bibliothek
implementieren lassen, und dann umbenennen & unter dem selben Namen
laden lassen.

Alles in allem sehr aufwendig und fehleranfaellig.

Wenn du Kontrolle ueber die erste Schicht C hast, dann wuerde ich dort
ansetzen, und die Funktionen ueber Pointer realisieren. D.h. du linkst
zwar immer noch gegen deine Bibliothek, aber du rufst nicht einfach
direkt auf, sondern durch eine globale Variable eines
Funktionspointers. Den musst du natuerlich in einem Stueck init-code
erstmal auf die Standard-Implementation von deiner gelinkten Lib setzen,
aber du kannst auch eine Funktion anbieten, die da eine ctypes-callback
reinsetzt.

Diez

Ähnliche fragen