2013-10-29 3 views
5

Ich nehme C auf, um einige Teile eines großen Python-Projekts zu beschleunigen. Um einem kontinuierlich laufenden Python-Skript neue Funktionen hinzuzufügen, habe ich gelegentlich eine .py-Datei überprüft und deren Inhalt integriert. Ich habe mich gefragt, ob es eine Möglichkeit gäbe, das Äquivalent in C zu machen. Gibt es eine Möglichkeit, den Inhalt einer dynamischen Bibliothek im Handumdrehen aufzunehmen?In C, ist es möglich, neuen Code in einen laufenden Prozess durch Neukompilieren einer dynamischen Bibliothek zu integrieren?

+0

Haben Sie die Verwendung von http://cython.org/ oder http://pypy.org/ in Betracht gezogen, um den Code zu beschleunigen, der beachtet werden muss? – ChrisProsser

+3

@ChrisProsser. Ich hatte über Pypy nachgedacht, aber das war eine gute Ausrede, um C zu lernen. Ich könnte tatsächlich mit Cython gehen, wenn ich ein Handle auf C bekomme. –

Antwort

6

Ja, Sie müssen dlopen verwenden, um auf die Bibliothek zuzugreifen, anstatt zur Kompilierungszeit zu verknüpfen, und dann dlsym, um auf die darin enthaltenen Funktionen zuzugreifen. Um zu einer neuen Bibliothek zu wechseln, müssen Sie dlclose das Handle und erstellen Sie eine neue - das Umwickeln dieses in einem Modul, um alle davon zu behandeln ist keine sehr schwierige Aufgabe.

+0

Die Verwendung von 'dclose' in einem laufenden Prozess kann schwierig sein. Sie müssen sicherstellen, dass keine Verweise auf die alte Bibliothek vorhanden sind (z. B. ein Zeiger auf eine statische Variable). – ugoren

+0

Es scheint mir erwähnenswert, dass, obwohl Sie eine beliebige lib verknüpfen können und solange Sie wissen, dass der Symbolname einen Verweis auf eine seiner Funktionen erhält, ** Sie ** jetzt ** die Funktionssignatur im Voraus benötigen, wenn Sie möchten um es erfolgreich zu nennen. – alk

+0

Nicht wirklich wahr. Theoretisch könnten Sie eine einzige definierte Funktionssignatur haben, die die Signatur des Rests des Moduls liefert, sowie Anpassungsdaten, die Ihr Ladermodul dann analysiert und verwendet. Es wäre groß und unhandlich, aber du könntest es tun. –

Verwandte Themen