Konzept für eine libwrapper extension

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
wegi

Hi,
ich bin noch relativ neu in python und erst recht im schreiben von C extensions, wenn das also irgendwie trivial ist, wäre mir auch schon mit ein paar links bzw. Schlagwörter geholfen :) Prinzipiell funktioniert die extension auch aber mit einem Teil habe ich Probleme:

Ich moechte einen wrapper fuer eine C lib schreiben die in etwa so aussieht:

Code: Alles auswählen

struct Class {
    int data;
    void (*modify)(Class *, int new);
Also in gewisser Weise OOP mit C. Für modify gibt es eine Standardimplementierung, um aber die lib richtig nutzen zu können muss man eine Wrapper Funktion schreiben in etwa so:

Code: Alles auswählen

void myModify(Class *c, int new) {
    if (new > 3) 
        modify(c, new);
}

struct Class *c;
c = malloc(sizeof(Class));
c->data = 0;
c->modify = &mymodify;
myModify soll in python geschrieben werden. Ich habe mir das ganze so gedacht, das Modul stellt eine Klasse Class bereit, die eine methode mymodify hat, die einfach modify aus der C lib aufruft. Ein User sollte dann einfach eine von Class abgeleitete Klasse erstellen, mymodify ueberschreiben und an geeigneter Stelle die mymodify methode der baseclass aufrufen.

Umsetzen moechte ich das so:
in __init__ wird das struct initialisiert, als modify wird ein pointer zu einer Hilfsfunktion uebergeben, diese Hilfsfunktion ruft dann die python methode mymodify auf, welche wiederum das echte modify (C lib) aufruft (Hoffe das war verständlich).

Das Problem ist jetzt, wie kann ich von der Hilfsfunktion die python Methode mymodify aufrufen, also wie komme ich an die richtige Klasse ran, denn wenn der User die Klasse abgeleitet hat soll ja die neue mymodify Methode aufgerufen werden (die dann gegebenenfalls die baseclass mymodify Methode aufruft)?

Vielleicht habe ich aber nur einen Denkfehler und man löst sowas ganz anders, wäre um jeden Hinweis/Denkanstoss dankbar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi wegi,

auf die schnelle, vielleicht hilft dir PyObject_CallMethod(...) aus http://docs.python.org/api/object.html


Gruß & gn8

Dookie
[code]#!/usr/bin/env python
import this[/code]
wegi

Danke erstmal, das funktioniert so halbwegs :). Ich kopiere von init aus den self pointer auf eine globale pointer variable, die ich dann PyObject_CallMethod() uebergebe, das funktioniert soweit auch, aber nur fuer die baseclass, wenn ich eine abgeleitete Klasse habe und mymodify ueberschreibe nimmt er trotzdem das von der baseclass.

Eine Frage dazu hat Py_INC/DECREF auch Auswirkungen auf solche Sachen, oder schaffe ich mir dadurch "nur" memory leaks? Ich habe das bisher sehr schlampig gehandhabt, weil ich noch nicht den voelligen Durchblick habe. Naja werd mich ein bisschen einlesen zu dem Thema.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

uiuiui, mit inc/decref kannst du dir schnell memoryleaks oder auch seltsame abstürze einfangen, wenn du da nicht sorgfältig mit umgehst. Das solltest Du dir nochmal genau durchlesen und auch die Sourcen von Python mal anschauen, daraus habe ich sehr viele Anregungen und Einsichten in die Interna erhalten.

Wenn eine in C erstellte Methode aufgerufen wird, so bekommt diese doch eh self als erstes Argument. Dann sollte der Methodenaufruf auch die Methode einer abgeleiteten Classe ansprechen.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
wegi

Ja INC/DECREF werd ich mir nochmals intensiver zu Gemuete fuehren, und meinen Fehler habe ich jetzt auch gefunden, ... aber ...aehh ... den trauch ich mir hier fast nicht zu sagen. Also ... Na gut, ich habe in der abgeleiteten Klasse beim ueberschreiben der mymodify methode das self vergessen :oops: :oops:

Danke jedenfalls fuer die rasche Hilfe.
wegi

P.S.: schoene Gruesse nach Salzburg aus Oberalm ;)
Antworten