Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#9

AW: Python im Delphi ausführen (geht nicht)

  Alt 22. Jan 2021, 11:40
@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).
Angehängte Dateien
Dateityp: zip PyTest.zip (52,2 KB, 7x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Jan 2021 um 12:32 Uhr)
  Mit Zitat antworten Zitat