Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Wie Embedded-Python und PIP?

  Alt 11. Jan 2024, 14:52
Nja, erstmal haben wir ein paar Bugfixe im python4delphi. (könnte bei Gelegenheit mal nachsehn, wie ich unseren firmeninternen Github-Fork in einen Öffentlichen umkopiere)

Dann ist das Ganze noch in eine Python-Klasse eingebettet, welche das Suchen/Laden der DLL übernimmt, die eigentliche Python-Klasse und ein paar Module/Funktionen intern erstellt/verwaltet.
Im Endeffekt kommt bei der Suche sowas raus, was man auch manuell zuweisen könnte. (aus einer der DFM der Demoanwendungen kopiert)
Code:
  object PythonEngine1: TPythonEngine
    DllName = 'python39.dll'
    DllPath = 'E:\EXE\Python'
    APIVersion = 1013
    RegVersion = '3.9'
    UseLastKnownVersion = False
    ...
Für das PIP im Embedded hatte ich zwei Lösungen gefunden
* PIP als Modul im PIP selbst installiert (wird über ein initialies Python-Script "teilweise" eingerichtet)
* oder PIP als Python-Application (PYZ)
* Letzeres haben wir bei uns im Einsatz

[das Python]
Infos: https://wiki.python.org/moin/EmbeddedPython
Quelle: https://www.python.org/downloads/windows/
Download: https://www.python.org/ftp/python/3....mbed-win32.zip

[als App]
Quelle: https://pip.pypa.io/en/stable/installation/#get-pip-py
Download: https://bootstrap.pypa.io/pip/pip.pyz
Nutzung: python.exe pip.pyz <command> <params>

[als Modul]
Installaionsscript: https://bootstrap.pypa.io/get-pip.py -> python.exe get-pip.py
Nutzung: python.exe -m pip <command> <params>
z.B. python pip.pyz install <modulname>

In der python38._pth die Suchpfade für's PIP hinzufügen (für Suche der Python-Scripte&Module)
Code:
python38.zip
.
Addons
Lib\site-packages
und dann auch nochmal zur Laufzeit der Komponente/DLL (für Helper-EXEn welche die Module mitbringen)
Delphi-Quellcode:
// PIP-ScriptHelper in Suchpfad
P := EnviromentVar('PATH', False);
S := ExtractFilePath(FPythonDLLFilename) + 'Scripts';
if DirectoryExists(S) and not ContainsText(P, S) then
  SetEnvironmentVariable('PATH', PChar(S + ';' + P));

Probleme haben wir beim Embedded aber mit Pyhon-Komkomenten aus'm PIP, welche wiederum selbst DLLs laden,
da diese DLLs, nach Ausführung des Scripts, "meistens" garnicht oder nicht richtig wieder entladen werden.
Und beim nächsten Ausführen eines anderen Scriptes es dann blöde Fehler gibt, auch bis dahin, dass garnichts mehr geht. Oder es mindestens Speicherlecks gibt, welche sich bis zum Kollaps aufsummieren.



Hier ein Auszug der Info-Datei, welche ich mal bei uns im Projekt hinterlegt hab (bissl Firmeninternes entfernt/anonymisiert)
Code:
Download         : https://www.python.org/downloads/windows/
                     -> "Windows embeddable package (32-bit)", da Delphi&UnserProgramm als Win32
                     https://www.python.org/ftp/python/3.8.10/python-3.8.10-embed-win32.zip

aktuelle Version : Python 3.8.10 Embedded 32-bit

Python-UPGRADE   : aktuelles siehe "Download"
                    ins DIESES Verzeichnis "Python3" entpacken
                    Kann alles gelöscht/überschrieben werden, siehe "restliche *.pyd"
                    ABER in der python**._pth die Suchpfade beachten, siehe "python38._pth"
                    ...
                    und zuletzt siehe "python pip.pyz"

                    LÖSCHEN: charset_normalizer\md.cp38-win32.pyd und charset_normalizer\ md__mypyc.cp38-win32.pyd
                       werden durch PIP in den Download eingefügt und führen zu Problemen.
                       https://www.delphipraxis.net/1524779-post6.html

SourceCode der Python**.dll -> https://github.com/python/cpython -> \Include\pylifecycle.h



[[ Anleitung PIP : Package Installer for Python ]]

Installation siehe "pip.pyz"
Explorer > ProgrammVerzeichnis\Python3
in Adressleiste : CMD [Enter]

python pip.pyz help                     Hilfe
python pip.pyz list                     Liste des Installierten
python pip.pyz search                   Suchen : geht nicht mehr, aber siehe https://pypi.org/search bzw. https://pypi.org/classifiers/

python pip.pyz install <modulname>      Installieren
python pip.pyz uninstall <modulname>    Deinstallieren
python pip.pyz show <modulname>         Infos: Abhängigkeiten, Version, Beschreibung, Quelle usw.

python pip.pyz check                    Abhängigkeiten prüfen



[[ Einiges vom Verzeichnisinhalt des "Python3" ]]

python.exe        = nutzen wir im Programm nicht (aber für PIP oder z.B. manuelles Ausführen der DebugBackup-Datei *.py aus Programm)
python3.dll       = Forward-DLL mit Weiterleitung zur jeweiligen python3*.dll
python38._pth     = Python-Config : Suchpfade und optional ein InitialScript
                         "python38.zip" , "." und unser Zusatz für's PIP "Lib\site-packages" , sowie ein "Addons"
python38.dll      = [Version 3.8.10]  das Python
python38.zip      = [Version 3.8.10]  viele StandardModule (os, io, datetime, zip, base64, xml, json, csv, email, ...)
                   = ist ein site-package (wird über python39._pth geladen) und enthält viele *.pyc (compiled bytecode)
                         diese können ebenfalls in den eigenen Scripten genutzt werden
*.pyd             = vorkompilierte Python-Module (DLLs), zur Nutzung innerhalb der Scripte
*.pyc             = kompiliertes Python-Script
*.py              = Python-Script
*.pyz             = Python Zipped Executable ist wohl sowas Ähnliches wie *.pyd

restliche *.pyd   = stammen aus der python-3.8.10-embed-win32.zip, also ebenfalls Standard-Zeugs, wie die python38.zip
                     -> bis auf DIESE Info-Datei, bzw. die Versions-Info, die "pip.pyz" und unsere angepasste "python38._pth"

__pycache__\       = [gitignore] Cache der Python-EXE/DLL (kompilierte *.pyc der *.py)

Addons\            = Zusätzliche Scripte von uns (siehe Nachfolgend "Addons")
Lib\site-packages\ = Python-Module via PIP installiert
Scripts\           = Tools vom PIP

pip.pyz           = [Version 3.6]     Package Installer for Python - der Paketmanager (siehe "Anleitung PIP")
                                                               Quelle:    https://pip.pypa.io/en/stable/installation/#get-pip-py
                                        [als Python-Anwendung] Download:  https://bootstrap.pypa.io/pip/pip.pyz
                                                               muß ins Hauptverzeichnis, geht nicht aus .\Addons\
                                                               "CMD: python.exe pip.pyz <command> <params>"
                                        [als Python-Modul]    Alternativ: https://bootstrap.pypa.io/get-pip.py
                                                               dieses runterladen und installieren "python.exe get-pip.py"
                                                               landet im .\Lib\site-packages\
                                                               "CMD: python.exe -m pip <command> <params>"
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat