@mmw: Das LoadDll steht 3 Zeilen drüber drin.
SetPythonHome und MaskFPUExceptions .... muß noch ausprobiert werden.
Also, Project1 hat eine PythonEngine und lässt Python über die ganze Laufzeit geladen/initialisiert.
*
das funktioniert inzwischen erstmal
* Die Variablen müssen aber manuell gelöscht werden (hab noch keine "Reset/Clear-Funktion gefunden), damit sie keine negativen Auswirkungen auf nachfolgende Scriptausführungen haben können.
-> z.B. einmal ausführen, dann die/eine Variablen-Zuweisung im InitScript oder Script löschen/auskommentieren ... und ohne das DELETE (CheckBox deaktiviert), ist die Variable bei der nächsten Ausführung immernoch da
* Erstellte Funktionen/Klassen und geladene Module müssten vermutlich auch noch gelöscht/entladen werden, vor/nach/zwischen den Aufrufen.
In Project2 hab ich versucht das Python vor/nach jeder Aufgabe
neu zu initialisieren, bzw. die
DLL komplett neu zu laden.
* beim ersten Durchlauf geht es
* und nachfolgend kommt dann nie wieder was raus
* hab schon gesehen, dass RedirectIO im Finalize auf False gesetzt wird,
aber es vor dem Initialize wieder auf True zu setzen knallt dann, da wohl die internen IO-Funktionen verschwunden sind, bzw. vielleicht auch das ganze FIOPythonModule.
Auch hab ich noch nicht ausprobiert, wenn es mehrere Forms mit einer TPythonEngine gibt,
welche öfters erstellt/freigeben werden und eventuell auch gleichzeitig existieren.
[Edit]
Hab 'nen Erstellenbutton in die Demos gebaut.
Und beim Erstellen der zweiten Form ....
Zitat:
There is already one instance of TPythonEngine running
Bleibt noch der Versuch TPythonEngine manuell zu erstellen, den Code auszuführen und sofort wieder freizugeben. (wenn sich das "running" nicht beenden/neustarten lässt)
(in der Hoffnung, dass dort das funktioniert, was in Project2 nicht geht, also mehrmals die
DLL neu zu laden/initialisieren)
Ansonsten bleibt wohl nur noch die Möglichkeit einer globalen Instanz, wo dann Variablen und so manuell gelöscht werden müsse, wie in Project1.
[/Edit]
Das Ziel ist es, am Ende z.B.
ExtractFilePath(Application.ExeName) + 'Python\python123.dll'
für DllPath/DllName/SetPythonHome zu verwenden,
um eine "definierte" Python-Version nutzen zu können, unabhängig davon ob oder was für eine Version im Windows installiert ist.
(es wäre zu schön, wenn UseLastKnownVersion nicht sonstwo, sondern nur im DllPath suchen würde, wenn dort etwas angegeben wurde)
Also eine der Embeddeable liegt in unserem Programmverzeichnis
https://www.python.org/downloads/windows/
und Jene wird dann verwendet.
Aktuell muß noch manuell der DllPath und DllName in den Project1/2 eingestellt werden. (aber ich versuche schon diese Werte aus Variablen/Edits per Code zuzuweisen um zu sehen, ob sie auch programmseitig änderbar sind, während/nachdem die Form/Komponente geladen wurde)
Im Prinzip kann/wird es auch mehrere Module (Form-Instanzen) geben, welche teilweise gleichzeitig geladen sind und jeder zu Beginn etwas/mehreres ausführt (nacheinander, da alles im Hauptthread).