dynload

Code-Stücke können hier veröffentlicht werden.
Antworten
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

Dynload is eine einfache klasse zum dynamischen laden von symbolen aus shared objects (.so dateien) oder DLLs, welche ich nun schon seit einigen Monaten zum debuggen und experimentieren einsetz.

Hier geht's zum Code. Die Dokumentation gibts Hier.

Da ich zum testen der MessageBox funktion Wine verwende, kann ich nicht garantieren, dass es auch unter Windows läuft (was ich aber für unwahrscheinlich halte).

Viel spass damit! =)
Zuletzt geändert von stuhlbein am Sonntag 11. Oktober 2009, 01:57, insgesamt 5-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Ich frage mich, was der Vorteil gegenüber einer direkten Verwendung von ctypes ist? Du hast es sogar noch komplizierter gemacht. Lediglich Nicht-Strings werden abgefangen.

Die "__dyn_getattr"-Methode kannst du sparen und direkt in "load" schreiben. Letzteres tut irgendwie genau nichts ;-) Oder besser: mach wenigstens ein __getattr__ draus, dann sparst du dir die "load"-Aufrufe.

"Private" Attribute markiert man in Python übrigens mit einem vorausgehenden Unterstrich, zwei Unterstriche werden verwendet, um Namenskollisionen zu vermeiden.
Das Leben ist wie ein Tennisball.
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

gnaaah, doppelpost... sorry =((
Zuletzt geändert von stuhlbein am Samstag 10. Oktober 2009, 01:27, insgesamt 1-mal geändert.
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

EyDu hat geschrieben:Hallo.

Ich frage mich, was der Vorteil gegenüber einer direkten Verwendung von ctypes ist? Du hast es sogar noch komplizierter gemacht. Lediglich Nicht-Strings werden abgefangen.
Wie meinst du das, "nur nicht-strings werden abgefragt"?
Die "__dyn_getattr"-Methode kannst du sparen und direkt in "load" schreiben. Letzteres tut irgendwie genau nichts ;-) Oder besser: mach wenigstens ein __getattr__ draus, dann sparst du dir die "load"-Aufrufe.
ersteres stimmt, zweiteres nicht, denn mit __getattr__ würdest du spätestens dann auf die nase fallen, wenn du versuchen würdest, C++-funktionsnamen zu laden (zb "?h@@YAXH@Z" wie sie zb von VisualC++ generiert werden). Bei GCC (G++) hat man dieses problem zwar nicht, aber es ist in dieser form einfach Plattform-unabhängig(er).
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

stuhlbein hat geschrieben:Wie meinst du das, "nur nicht-strings werden abgefragt"?
Ich meinte aufrufe wie beispielsweise printf(1) an Stelle von printf("1").
stuhlbein hat geschrieben:ersteres stimmt, zweiteres nicht, denn mit __getattr__ würdest du spätestens dann auf die nase fallen, wenn du versuchen würdest, C++-funktionsnamen zu laden (zb "?h@@YAXH@Z" wie sie zb von VisualC++ generiert werden). Bei GCC (G++) hat man dieses problem zwar nicht, aber es ist in dieser form einfach Plattform-unabhängig(er).
Stimmt, ich hatte ich nicht an die bösen Compiler gedacht :roll: Dann würde ich einfach einfach beides anbieten: Für einfache Namen kann man dan __getattr__ verwenden, für seltsame dann die load-Funktion. Ist ja nur ein

Code: Alles auswählen

    __getattr__ = load
Das Leben ist wie ein Tennisball.
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

EyDu hat geschrieben:
stuhlbein hat geschrieben:Wie meinst du das, "nur nicht-strings werden abgefragt"?
Ich meinte aufrufe wie beispielsweise printf(1) an Stelle von printf("1").
Da bricht Python mit einem segfault ab, aber ich schieb das nicht auf Dynload, sondern eher auf den wert, den printf() erwartet =)
EyDu hat geschrieben: Stimmt, ich hatte ich nicht an die bösen Compiler gedacht :roll: Dann würde ich einfach einfach beides anbieten: Für einfache Namen kann man dan __getattr__ verwenden, für seltsame dann die load-Funktion. Ist ja nur ein

Code: Alles auswählen

    __getattr__ = load
done.
Antworten