Python in Delphi verwenden: Wege, Code und Stolperfallen
Ja, Sie können Python in Delphi verwenden – und zwar auf mehreren Wegen, die sich in Aufwand, Geschwindigkeit und Kopplung deutlich unterscheiden. Der Grund ist meist derselbe: Ihre Delphi-Anwendung soll auf eine Python-Bibliothek zugreifen, die es für Object Pascal nicht gibt – etwa NumPy, pandas, scikit-learn, OpenCV oder ein KI-Modell. Nachfolgend die drei praktikablen Ansätze, wann welcher passt, konkreter Beispielcode für jeden – und was bei der Einrichtung typischerweise schiefgeht.
Die drei Wege im Überblick
Bevor Sie Code schreiben, sollten Sie sich für eine Architektur entscheiden. Es gibt im Wesentlichen drei:
- Python einbetten mit Python4Delphi (P4D): Der Python-Interpreter läuft direkt im Prozess Ihrer Delphi-Anwendung. Sie führen Skripte aus, tauschen Variablen aus und rufen Python-Funktionen fast wie native Aufrufe auf. Enge Kopplung, geringe Latenz.
- Python als externen Prozess aufrufen: Sie starten
python.exeüber die Kommandozeile, übergeben Argumente und lesen die Ausgabe zurück. Lose Kopplung, sehr robust, aber langsamer Datenaustausch. - Delphi-GUIs aus Python heraus bauen (DelphiVCL/DelphiFMX): Der umgekehrte Fall – die Hauptlogik liegt in Python, und Sie nutzen Delphis Oberflächen-Bibliotheken über ein pip-Paket.
Für die meisten „Ich brauche eine Python-Bibliothek in meiner bestehenden Delphi-App”-Fälle ist Python4Delphi die richtige Wahl.
Python4Delphi (P4D): der Standardweg
Python4Delphi ist eine quelloffene Komponenten-Sammlung, die den CPython-Interpreter zur Laufzeit über die Python-DLL (python3XX.dll) in Ihre Delphi-Anwendung lädt. Das Projekt wird von Kiriakos Vlahos (dem Autor von PyScripter) auf GitHub unter pyscripter/python4delphi gepflegt und funktioniert sowohl mit Delphi als auch mit Free Pascal/Lazarus.
Installation
Es gibt zwei gängige Wege:
- Über den GetIt Package Manager (im Delphi-IDE-Menü unter Tools › GetIt-Paket-Manager): Suchen Sie nach „Python4Delphi” und installieren Sie das Paket. Danach stehen die Komponenten im Palette-Reiter Python bereit.
- Aus den Quellen: Repository klonen, den Quellordner (
SourceundSource\vcl) zum Bibliothekspfad Ihrer Zielplattform hinzufügen, dann die ProjektgruppePackages\Delphi\P4DComponentSuite.groupprojöffnen, komplett kompilieren und anschließend die Design-Time-PackagesdclPython,dclPythonVclunddclPythonFmxinstallieren.
Die zentralen Komponenten sind TPythonEngine (der Interpreter), TPythonGUIInputOutput (leitet Pythons print-Ausgaben in ein TMemo um), TPythonModule und TPythonType (um eigene Delphi-Objekte nach Python zu exportieren) sowie TPythonDelphiVar für den Variablenaustausch.
Minimalbeispiel: Python-Code ausführen
Sie müssen keine Komponenten auf ein Formular ziehen – es geht auch rein im Code:
uses
PythonEngine;
var
PyEngine: TPythonEngine;
begin
PyEngine := TPythonEngine.Create(nil);
try
PyEngine.AutoLoad := False;
PyEngine.DllName := 'python311.dll'; // muss zur Bitness der EXE passen
PyEngine.LoadDll;
PyEngine.ExecString('print("Hallo aus Python")');
finally
PyEngine.Free;
end;
end;
Einen Rückgabewert holen Sie mit EvalStringAsStr (liefert direkt einen string); EvalString gibt stattdessen das rohe Python-Objekt zurück, wenn Sie damit weiterrechnen wollen:
var
Ergebnis: string;
begin
Ergebnis := PyEngine.EvalStringAsStr('sum([1, 2, 3, 4])');
ShowMessage(Ergebnis); // -> 10
end;
Für den Zugriff auf ganze Bibliotheken importieren Sie sie im Skript wie gewohnt. Ein realistisches Beispiel mit NumPy:
PyEngine.ExecString(
'import numpy as np' + sLineBreak +
'a = np.arange(6).reshape(2, 3)' + sLineBreak +
'print(a.sum())');
Mehrzeiligen Code halten Sie am übersichtlichsten in einer TStringList (oder einem TMemo auf dem Formular) und übergeben ihn mit PyEngine.ExecStrings(Skript).
Damit import numpy klappt, muss NumPy in genau dem Python-Interpreter installiert sein, dessen DLL Sie laden – also z. B. per pip install numpy in derselben Umgebung.
Daten zwischen Delphi und Python austauschen
Für den Werteaustausch bietet P4D mehrere Mechanismen. Am bequemsten ist das Unit VarPyth, das Python-Objekte als Delphi-Variant kapselt:
uses
PythonEngine, VarPyth;
var
np, arr: Variant;
begin
np := Import('numpy');
arr := np.array(VarPythonCreate([1, 2, 3, 4]));
ShowMessage(arr.sum()); // ruft die Python-Methode direkt auf
end;
Umgekehrt exportieren Sie Delphi-Funktionen mit TPythonModule nach Python, sodass Ihr Skript sie aufrufen kann. Das ist die Grundlage für eine echte Zwei-Wege-Integration.
Der einfache Weg: Python als externer Prozess
Wenn Sie nur gelegentlich ein fertiges Skript ausführen und Performance nicht kritisch ist, sparen Sie sich P4D komplett. Sie rufen python.exe auf und lesen das Ergebnis über die Standardausgabe:
uses
System.SysUtils, Winapi.ShellAPI;
// Einfachste Variante ohne Ausgabe-Rückgabe:
ShellExecute(0, 'open', 'python.exe',
PChar('C:\Skripte\analyse.py --input daten.csv'),
nil, SW_HIDE);
Wollen Sie die Ausgabe zurückbekommen, verwenden Sie CreateProcess mit umgeleiteten Pipes oder eine Hilfsbibliothek. Praktisch reicht oft: Skript schreibt sein Ergebnis als JSON in eine Datei, Delphi liest sie danach ein. Vorteile dieses Ansatzes: keine DLL-Abhängigkeit, keine Bitness-Probleme, Abstürze im Python-Teil reißen Ihre Anwendung nicht mit. Nachteil: der Datenaustausch über Dateien oder Streams ist umständlich und bei häufigen Aufrufen spürbar langsam. Wer den Vergleich der beiden Sprachen im Berufsalltag interessant findet, dem liefert unser Beitrag Was bezahlt mehr – C oder Python? zusätzlichen Kontext.
Der umgekehrte Fall: DelphiVCL für Python
Manchmal ist die Ausgangslage andersherum: Ihre Anwendung ist in Python geschrieben, aber Sie möchten eine native Windows-Oberfläche mit Delphis Komponenten. Dafür gibt es die pip-Pakete delphivcl (VCL, Windows) und delphifmx (FireMonkey, plattformübergreifend):
pip install delphivcl
from delphivcl import Application, Form
class MainForm(Form):
def __init__(self, owner):
self.Caption = "Hallo aus Python"
self.SetBounds(100, 100, 400, 300)
def main():
Application.Initialize()
Application.Title = "Demo"
form = MainForm(Application)
form.Show()
Application.Run()
form.Destroy()
main()
Technisch sind diese Pakete die andere Seite derselben Medaille: Sie nutzen P4D, um Delphis Oberflächen-Framework als Python-Modul verfügbar zu machen.
Die häufigsten Fehler – und ihre Lösung
„DLL konnte nicht geladen werden” / falsche Bitness. Der mit Abstand häufigste Stolperstein: Eine 32-Bit-Delphi-EXE kann nur eine 32-Bit-Python-DLL laden, eine 64-Bit-EXE nur eine 64-Bit-DLL. Prüfen Sie die Zielplattform Ihres Projekts (Projekt › Zielplattformen) und installieren Sie die passende Python-Version. Mischen Sie die Bitness, scheitert LoadDll sofort.
DLL wird nicht gefunden. Setzen Sie PyEngine.DllPath explizit auf das Verzeichnis Ihrer Python-Installation, oder lassen Sie P4D über die Registry suchen (RegVersion bzw. SetupType). Verlassen Sie sich nicht darauf, dass Python im PATH steht.
import einer Bibliothek schlägt fehl. Die Bibliothek muss im geladenen Interpreter installiert sein. Bei mehreren parallelen Python-Installationen laden Sie leicht die falsche DLL. Am robustesten ist eine dedizierte virtuelle Umgebung, deren python3XX.dll und site-packages Sie gezielt ansteuern.
Threads und der GIL. CPythons Global Interpreter Lock verhindert echte Parallelität. Rufen Sie Python aus mehreren Delphi-Threads auf, müssen Sie den GIL korrekt anfordern und freigeben (PythonEngine bietet dafür Hilfen wie ThreadState-Handling). Ohne Sorgfalt drohen sporadische Abstürze.
Deployment. Ihre Endanwender haben Python nicht installiert. Sie müssen die passende Python-Laufzeit (DLL plus die benötigten Pakete) mit ausliefern und die Pfade zur Laufzeit korrekt setzen. Kalkulieren Sie das früh ein – es ist mehr Aufwand als der Integrationscode selbst.
Welcher Weg passt zu Ihnen?
- Enge Integration, viele Aufrufe, Datenaustausch: Python4Delphi.
- Ein Skript gelegentlich laufen lassen, maximale Robustheit: externer Prozess.
- Python-first mit nativer Windows-Oberfläche: DelphiVCL/DelphiFMX.
Dass sich der Aufwand überhaupt lohnt, hängt auch davon ab, wie zukunftssicher Ihre Delphi-Codebasis ist – dazu ordnet unser Artikel Wird Delphi noch verwendet? die Lage ein. Und wenn Sie grundsätzlich zwischen Ökosystemen abwägen, hilft die Übersicht Welche Programmiersprachen sind wichtig?.
FAQ
Ist Python4Delphi kostenlos? Ja. P4D steht unter der MIT-Lizenz und darf uneingeschränkt auch in kommerziellen Projekten eingesetzt werden.
Läuft das auch mit Free Pascal / Lazarus statt Delphi?
Ja. Python4Delphi unterstützt Free Pascal und Lazarus. Der Komfort der IDE-Komponenten ist dort etwas geringer, der prinzipielle Ansatz – DLL laden, ExecString, Variablen austauschen – ist identisch.
Wird der Python-Code durch Delphi schneller? Nein. Python läuft weiterhin im interpretierten CPython. Delphi startet den Interpreter nur und tauscht Daten aus; rechenintensive Teile sind so schnell (oder langsam) wie in reinem Python. Der Geschwindigkeitsvorteil kommt allein daher, dass Sie den Aufruf-Overhead eines externen Prozesses vermeiden.