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! =)
dynload
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.
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.
Wie meinst du das, "nur nicht-strings werden abgefragt"?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.
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).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.
Ich meinte aufrufe wie beispielsweise printf(1) an Stelle von printf("1").stuhlbein hat geschrieben:Wie meinst du das, "nur nicht-strings werden abgefragt"?
Stimmt, ich hatte ich nicht an die bösen Compiler gedacht 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 einstuhlbein 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).
Code: Alles auswählen
__getattr__ = load
Das Leben ist wie ein Tennisball.
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:Ich meinte aufrufe wie beispielsweise printf(1) an Stelle von printf("1").stuhlbein hat geschrieben:Wie meinst du das, "nur nicht-strings werden abgefragt"?
done.EyDu hat geschrieben: Stimmt, ich hatte ich nicht an die bösen Compiler gedacht 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