Embedded Python Scripting

26.05.2023
|

In einer Business Software mit Objektmodell ist es ganz nützlich, eine integrierte Scriptsprache zur Verfügung zu haben. Sofern die Integration den Zugriff auf die Businessobjekte und gewisse interne APIs erlaubt, kann damit vieles kundenspezifisch automatisiert werden.

Für die ersten Schritte mit Scripting hatten wir bei Vertec auf Visual Basic Script (VBScript) gesetzt. Das war auch recht einfach, da unsere Applikationen bereits eine COM Schnittstelle zur Verfügung stellten und VBScript diese direkt nutzen konnte. Von den sprachlichen Möglichkeiten, die VBScript bietet, war ich aber nie wirklich begeistert. Wenn wir da weiterkommen wollten, musste eine «echte» Programmiersprache her.

Zum Glück Python

Zu der Zeit, vor vielen Jahren, begann der Aufstieg von Python als neuer Stern am Sprachen-Himmel. Die Sprache war noch nicht sehr bekannt, es sprach sich aber herum, dass sie intern von Google eingesetzt würde, und das hiess ja schon mal was. Was damals für Python sprach, war die klare Struktur, gute Lesbarkeit und das Modulkonzept. Ausserdem hatte die Sprache ein internes API, das ein Embedding ermöglichte. Glücklicherweise hatten wir auf das richtige Pferd gesetzt, denn Python ist mittlerweile eine der bekanntesten und weitverbreitetsten Programmiersprachen.

Embedding von Python

Wie bringen wir denn nun Python als Sprache in unsere eigene Applikation? Das Python «Extending and Embedding API» basiert auf der Programmiersprache C, bei uns eigentlich ein Tabu. Fertige Integrationen von Python in .NET gibt es leider keine, abgesehen von eigenen .NET Python Varianten wie IronPython, die aber leider nicht mehr wirklich gepflegt werden.

An dieser Stelle kommt uns unsere Delphi Vergangenheit zu Hilfe. Delphi ist eine recht moderne Hochsprache, eine Variante der Sprache Pascal, kann sich aber bei Bedarf gegenüber anderen Komponenten wie C verhalten (technisch gesagt, unterstützt es verschiedene «calling conventions»). Für eine Python Integration ist das ideal und tatsächlich gibt es das wunderbare in Delphi geschriebene Python4Delphi Projekt, welches das ganze interne Python API für Delphi aufbereitet. 

Die Vertec Software basiert zwar grösstenteils auf .NET und ist in C# geschrieben, gewisse Komponenten sind aus historischen Gründen aber noch in Delphi implementiert und lassen sich aus .NET Code aufrufen. So ist auch die Python Integration in Delphi implementiert und aus C# verwendbar.

Die Python4Delphi (kurz P4D) Library erlaubt es, Python-Module und Klassen in Delphi zu implementieren und diese Python zur Verfügung zu stellen.

Ausserdem bietet P4D Unterstützung für das Hosting von embedded Python Engines. Normalerweise wird ein Python Programm durch Starten des Python Interpreters python.exe und Angabe eines .py Scripts ausgeführt. Im Embedded Modus lädt das Host Programm, in unserem Fall Vertec, den Python Interpreter als DLL Library und ruft darauf bestimmte API Funktionen zum Starten eines Scripts auf. Anstatt python.exe heisst der Python Prozess dann z. B. Vertec.Session.exe und macht neben Python Scripts Ausführen noch eine Menge anderes.

Module und Adapter

Unsere Python Umgebung umfasst als Einstiegspunkt für Script-Code ein eingebautes Python-Modul «vtcapp», welches in Delphi implementiert ist. Es bietet Zugriff auf verschiedene Funktionen zur Interaktion mit der Vertec Software. Ein Beispiel wäre die «msgbox» Funktion, welche mit «vtcapp.msgbox(‘Hallo’)» eine Messagebox mit dem angegebenen Text anzeigt.

Richtig brauchbar wird die Scripting Integration aber erst mit einem möglichst nahtlosen Zugriff auf die Businessobjekte. Dafür haben wir eine generische Python Adapterklasse eingeführt, welche mit einem Vertec Businessobjekt verbunden ist. Pro Businessobjekt wird bei Bedarf ein solcher Adapter instantiiert und repräsentiert das Businessobjekt in Python.

Ganz Python-like haben wir auf den Adaptern die Python Standard-Methoden «__getattr__» und «__setattr__», natürlich als Delphi Methoden zugänglich, überschrieben und ermöglichen so den Zugriff auf alle Eigenschaften der Vertec Businessobjekte. Die Python Methoden machen dynamisch einen Lookup des angegebenen Members im Datenmodell und erlauben dann das Auslesen oder das Setzen der entsprechenden Eigenschaft. Auch eine «evalocl» Methode zum Auswerten von OCL Expressions darf auf den Adaptern nicht fehlen.

Python ist modular

Ein wesentlicher Vorteil von Python ist sein Modulkonzept. Komplexere Automatisierungs-Projekte lassen sich so in verschiedene Code-Module aufteilen, die von einem zentralen Modul importiert werden. Python Module sind üblicherweise einfach Python Files auf dem Filesystem. Das ist für unsere Zwecke etwas zu offen und unsicher. Darum erweitern wir den Python Import Mechanismus und definieren eigene Importer. Das geschieht grundsätzlich in Python, mit gewissen Einsprungspunkten, die in Delphi umgesetzt sind. Wie das generell funktioniert, beschreibt das «Python Enhancement Proposal» PEP-302. Wir ermöglichen so den Import von «eingebautem» Python Code aus den Applikations-Ressourcen sowie das Importieren von Python Modulen, welche als Vertec Datenobjekte abgelegt sind.

Ausserdem können wir auf diese Weise kontrollieren, welche Module importiert werden dürfen und welche nicht. Aus Gründen der Applikations-Sicherheit möchten wir dem Code in unserer Scripting-Umgebung nicht zu viele Freiheiten geben.

Scope dank Context

Da wir mittlerweile Python an zahlreichen Orten in unseren Applikationen verwenden, ist es wichtig, dass der interne Zugriff auf die Python Umgebung möglichst einfach und transparent ist. Pro Vertec Session existiert eine Python Umgebung, welche während der ganzen Session Laufzeit zur Verfügung steht. Das ermöglicht Anwendungen, wo Python Objekte über einen Aufruf hinweg weiter existieren. Für Dinge wie Caching oder Ähnliches ist das sehr nützlich.

Nun möchten wir aber trotzdem eine möglichst gute Isolation der verschiedenen Orte, wo Python verwendet wird. Insbesondere möchten wir Konflikte aufgrund von gleichlautenden Symbolen vermeiden. Das Python API sieht vor, dass beim Ausführen von Python Code jeweils ein Dictionary der lokalen Variablen mitgegeben wird. Das machen wir uns zunutze und haben das Konzept des PythonContext eingeführt. Es ist ein leichtgewichtiges Konstrukt mit eigenem Satz von lokalen Variablen sowie Zugriff-Funktionen, welche das Auslesen und Setzen von Python Werten in der Python Umgebung und das Umwandeln in die jeweils andere Welt (C# bzw. Delphi) übernehmen.

Aus .NET können wir uns in C# einen Python-Context anlegen und dort darauf einfach Python Statements und Expressions ausführen. Der Context hat dank lokaler Variablen einen eigenen Naming-Scope in Python. Er sieht die lokalen Variablen anderer Contexte nicht.

Geschenk für Power-User

Wir bauen die Möglichkeiten unserer Python Integration auf Basis der beschriebenen Konzepte laufend aus. So setzt zum Beispiel auch das Vertec Bericht-System zur Aufbereitung der Daten auf Python. Natürlich schaffen wir damit auch eine gewisse Komplexität, die verdaut werden muss. Das Customizing von Vertec mit Python ist sicher ein Werkzeug, das sich vor allem an Power-User richtet.

Die Möglichkeiten, damit eine Vertec Umgebung für den Kunden anzupassen, sind jedenfalls (fast) unbegrenzt.

None
08.11.2024

Das war die Anwendertagung 2024

Highlights der Vertec-Anwendertagung 2024: spannende Vorträge, neue Funktionen der Version 6.8 und wertvolles Networking. Lassen Sie den Nachmittag mit uns Revue passieren.
None
30.10.2024

ISO 27001– wie Vertec sich täglich für Sicherheit engagiert

Dieser Artikel zeigt, wie Vertec durch ISO 27001 und gezielte Sicherheitsmassnahmen Ihre Kundendaten schützt und eine nachhaltige Sicherheitskultur im Unternehmen fördert.
None
25.10.2024

So transformiert modernes Aktenmanagement Ihre Kanzlei: 5 Vorteile, die sich auszahlen

5 greifbare Vorteile für Fristenkontrolle, komfortable Nutzung, Anpassungsfähigkeit, Übersicht und Sicherheit.
None
15.10.2024

COM-Schnittstellen zukunftssicher gestalten

Entdecken Sie, wie Vertec mit „COM Forwarding“ bestehende COM-Schnittstellen cloudfähig macht.
None
03.10.2024

Warum Ihr Vertec regelmässige Pflege braucht

Nutzen Sie das volle Potential Ihrer Vertec Lösung? Entdecken Sie, wie regelmässige Reviews die Effizienz und Zukunftssicherheit Ihrer Software sicherstellen können.
None
23.08.2024

Wie wir Anwälte sehen: Der Weg zur optimalen Kanzleiorganisation

Erfahren Sie, wie Vertec Anwälte dabei unterstützt, Kanzleiprozesse wie die Mandatsverwaltung, Leistungserfassung, Fakturierung und Fristenkontrolle noch effizienter und erfolgreicher zu gestalten.
None
02.07.2024

Sollte man es tun, nur weil es geht?

Die immense Anpassbarkeit von Vertec bietet unzählige Möglichkeiten, die eigenen Geschäftsprozesse zu optimieren. Doch nicht jede Anpassung ist sinnvoll. Wo liegen die Grenzen der Anpassbarkeit?
None
29.05.2024

Vertec als CRM & ERP Software für Mac und iPhone

Auch auf dem Mac und iPhone bietet Vertec eine nahtlose Flexibilität und maximale Produktivität.
Bitte wählen Sie Ihren Standort