Wie initialisiert man einen eingebetteten Python-Interpreter?

8

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

    
nab 13.10.2011, 13:04
quelle

3 Antworten

4

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:

%Vor%

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     
nab 03.04.2012, 11:44
quelle
0

Wie wäre es mit code.IteractiveInterpreter ?

So etwas sollte es tun:

%Vor%     
Aleksey Vitebskiy 13.10.2011 17:15
quelle
0

Ich würde ein weiteres Shell-Skript schreiben, das jedes Mal die Sequenz der Testskripte mit neuen Python-Instanzen ausführt. Oder schreibe es in Python wie

%Vor%     
eudoxos 14.10.2011 07:10
quelle

Tags und Links