Ich arbeite daran, Python in unsere Testsuite-Anwendung einzubetten. Der Zweck besteht darin, mit Python mehrere Testscripts auszuführen, um Daten zu sammeln und Berichte über Tests zu erstellen. Mehrere Testskripts für einen Testlauf können globale Variablen und Funktionen erstellen, die im nächsten Skript verwendet werden können.
Die Anwendung stellt auch Erweiterungsmodule bereit, die in den eingebetteten Interpreter importiert werden und dazu dienen, einige Daten mit der Anwendung auszutauschen.
Aber der Benutzer kann auch mehrere Testläufe machen. Ich möchte diese Globals, Importe und die ausgetauschten Daten nicht zwischen mehreren Testläufen teilen. Ich muss sicher sein, dass ich in einem echten Zustand neu starte, um die Testumgebung zu kontrollieren und die gleichen Ergebnisse zu erhalten.
Wie sollte ich den Interpreter reinitialisieren?
Ich habe Py_Initialize () und Py_Finalize () verwendet, bekomme aber beim zweiten Durchlauf eine Exception, wenn ich die Erweiterungsmodule, die ich dem Interpreter zur Verfügung stelle, ein zweites Mal initialisiere. Und die Dokumentation warnt davor, sie mehrmals zu verwenden .
Die Verwendung von Sub-Interpretern scheint dieselben Einschränkungen wie Erweiterungsmodule zu haben Initialisierung.
Ich vermute, dass ich mit der Initialisierung meiner Erweiterungsmodule etwas falsch mache, aber ich befürchte, dass das gleiche Problem bei Erweiterungsmodulen von Drittanbietern auftritt.
Vielleicht ist es möglich, es zum Laufen zu bringen, indem Sie den Interpreter in seinem eigenen Prozess starten, um sicher zu sein, dass der gesamte Speicher freigegeben ist.
Übrigens benutze ich boost-python dafür, das auch mit Py_Finalize! GÜNSTIG warnt!
Irgendwelche Vorschläge?
Danke
Hier ist ein anderer Weg, den ich gefunden habe, um zu erreichen, was ich will, beginnen Sie mit einer sauberen Weste im Dolmetscher.
Ich kann die globalen und lokalen Namespaces steuern, die ich zur Ausführung des Codes verwende:
%Vor% Ich kann dann verwenden Sie die Namespaces für die Ausführung von Code in pyCode
enthalten:
Ich kann die Namespaces bereinigen, wenn ich eine neue Instanz meines Tests ausführen möchte, indem ich die Wörterbücher bereinige:
%Vor%Je nachdem, auf welcher Ebene ich die Ausführung ausführen möchte, kann ich global = local
verwenden Wie wäre es mit code.IteractiveInterpreter
?
So etwas sollte es tun:
%Vor%Tags und Links python c++ boost embed boost-python