Wie laden kompilierte python-Module aus dem Speicher?
Ich Lesen müssen alle Module (pre-compiled) aus einer zipfile (gebaut von py2exe komprimiert) in den Speicher und dann laden Sie Sie alle.
Ich weiß, das getan werden kann durch das laden direkt aus dem zipfile muss ich mir aber noch laden Sie Sie aus dem Speicher.
Irgendwelche Ideen? (Ich bin mit python 2.5.2 windows)
TIA Steve
- Können Sie geben einige weitere Hintergrundinformationen? Warum brauchen Sie zum laden des Codes in den Speicher in den ersten Platz? Warum dauert das laden von einer ZIP-Datei, die nicht passen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hängt davon ab, was genau Sie als "das Modul (pre-compiled)". Nehmen wir an, es ist genau der Inhalt einer
.pyc
Datei, z.B.ciao.pyc
als erbaut von:IOW, nachdem ich so gebaut
ciao.pyc
sagen, dass Sie jetzt tun:und Ihr Ziel ist, gehen Sie aus, dass byte-string
b
zu einem importierbaren Modulciao
. Hier ist, wie:dies ist, wie Sie den code erhalten haben-Objekt aus der
.pyc
binäre Inhalte. Bearbeiten: wenn du neugierig bist, die ersten 8 Byte sind eine "Magische Zahl" und ein timestamp -- hier nicht benötigt (es sei denn, Sie wollen die Vernunft-überprüfen Sie Sie und heben Ausnahmen, wenn Sie es verdienen, aber das scheint außerhalb des Bereichs der Frage;marshal.loads
erhöhen jedenfalls, wenn es erkennt eine beschädigte Zeichenfolge).Dann:
ich.e: machen Sie ein neues Modul, Objekt, installieren Sie es in
sys.modules
, füllen Sie es durch ausführen von code Objekt in seiner__dict__
. Bearbeiten: die Reihenfolge, in der Sie diesys.modules
einführen und dieexec
Angelegenheiten, wenn und nur wenn Sie die zirkuläre Importe-aber, dies ist die Reihenfolge Python seine eigenenimport
normalerweise verwendet, so ist es besser, ihn zu imitieren (die keine spezifischen Nachteile).Können Sie "machen Sie ein neues Modul-Objekt" in mehrfacher Hinsicht (z.B. von Funktionen in der standard-Bibliothek-Module wie
new
undimp
), aber "Aufruf der Art um eine Instanz" ist die normale Python-Weise in diesen Tagen, und die normale Stelle zu erhalten, den Typ aus (es sei denn, es hat einen built-in-Namen, oder Sie sonst haben es schon praktisch) ist aus der standard-Bibliothek Modultypes
, so das ist, was ich empfehlen.Nun endlich:
...können Sie das Modul importieren und verwenden seine Funktionen, Klassen und so weiter. Andere
import
(undfrom
) Aussagen wird, dann finden Sie das Modul alssys.modules['ciao']
, so dass Sie nicht brauchen, wiederholen Sie diese Sequenz von Operationen (in der Tat, die Sie nicht müssen diese Letzteimport
Aussage hier wenn alles, was Sie wollen, ist, um sicherzustellen, das Modul für den import von anderswo -- ich bin das hinzufügen es nur, um zu zeigen, dass es geht;-).Bearbeiten: Wenn du unbedingt importieren müssen, auf diese Weise Pakete und Module daraus, eher als "plain modules", wie ich gerade gezeigt habe, das ist machbar, aber etwas komplizierter. Als diese Antwort ist schon ziemlich lange, und ich hoffe, Sie können Ihr Leben zu vereinfachen, indem Sie sich an einfachen Module für diesen Zweck, ich werde entziehen, dass ein Teil der Antwort;-).
Beachten Sie auch, dass dies kann oder kann nicht tun, was Sie wollen, in Fällen der "laden das gleiche Modul aus dem Speicher mehrmals" (dies erstellt das Modul jedes mal; möchten Sie vielleicht zu prüfen, sys.Module und überspringen Sie einfach alles, ob das Modul bereits vorhanden) und insbesondere, wenn solche wiederholte "load from memory" Auftritt, die von mehreren threads (technische sperren -- aber eine bessere Architektur ist, um einen einzelnen dedizierten thread für die Aufgabe mit anderen Modulen kommuniziert mit ihm über eine Warteschlange).
Schließlich gibt es keine Diskussion darüber, wie um diese Funktionalität zu installieren, als ein transparent "importieren " Haken", die automatisch bekommt, die in die Mechanismen der
import
Anweisung Einbauten, die sich selbst -- das ist machbar, aber nicht genau das, was Sie sind das Fragen, so auch hier, ich hoffe, Sie können Ihr Leben zu vereinfachen, indem Sie die Dinge auf die einfache Art und Weise statt, wie diese Antwort skizziert..pyc
oder.pyo
nur --.pyd
s sind im wesentlichen.dll
s unter falschem Namen und Gegenwart vollständig verschiedene Probleme. @Technikgeil, du bist herzlich willkommen!-)Kompilierte Python-Datei aus
Laden Modul, das Sie erstellen, Modul-Objekt mit
imp.new_module()
führen unmashaled code in neues Modul-namespace und steckte es insys.modules
. Unten in der Beispiel-Implementierung:Update: der code aktualisiert wird, behandeln die Pakete richtig.
Beachten Sie, dass Sie haben zu installieren, import-hook-Griff Importe innerhalb geladenen Module. Ein Weg dies zu tun ist das hinzufügen von Ihrem finder in
sys.meta_path
. Sehen PEP302 für weitere Informationen.