Python Compile: Python-Code mithilfe einer Funktion ausführen

Um einzelne Codezeilen oder einen Codeblock direkt auszuführen und das Ergebnis in einer Variable zu speichern, können Sie die Python-Compile-Funktion benutzen. Sie liefert Ihnen ein Code-Objekt zurück, das Sie ausführen können.

Einsatzmöglichkeiten

Wenn Sie einzelne Codeanweisungen nicht direkt in Ihrem Python-Programm ausführen möchten, sondern lediglich einer Variable zuweisen wollen, dann können Sie die Python-Compile-Funktion einsetzen. Sie dient dazu, Quellcode in Objektcode umzuwandeln, und gibt Ihnen ein Objekt zurück, das Sie im Anschluss mithilfe von Python exec ausführen können. Sie können der Python-Compile-Funktion auch eine Datei übergeben, aus der der Quellcode extrahiert wird.

Tipp

Sie nutzen Python als effiziente Programmiersprache für Ihr Webprojekt? Dann hilft Ihnen IONOS Deploy Now dabei, noch effizienter zu arbeiten, indem Sie Ihre Websites jederzeit via GitHub deployen können. Die Echtzeit-Vorschau ermöglicht Ihnen, den aktuellen Stand Ihres Projekts jederzeit mit nur wenigen Klicks live anzuschauen.

Syntax von Python Compile

Die Python-Compile-Funktion kann mit bis zu sechs verschiedenen Parametern aufgerufen werden, wobei allerdings nur die ersten drei Parameter zwingend erforderlich sind. Die verbleibenden Parameter der Funktion sind optional und können nach Belieben gesetzt werden, um das Verhalten der Funktion zu spezifizieren.

compile(source, filename, mode, flags = 0, dont_inherit = False, optimize = -1)

Es hilft für das Verständnis der Compile-Funktion, sich einen Überblick über die einzelnen Parameter zu verschaffen.

Parameter Optional Beschreibung
source nein Hier übergeben Sie das, was Sie kompilieren möchten. Hierbei handelt es sich meistens um Strings, Sie können aber auch Byte-Objekte oder AST-Objekte übergeben.
filename nein An dieser Stelle geben Sie die Dateiquelle des zu kompilierenden Objektes an. Wenn es keine Datei gibt, können Sie schreiben, was Sie möchten. Der Parameter muss dennoch gesetzt werden.
mode nein Im Parameter mode spezifizieren Sie, wie kompiliert werden soll. Sie haben die Auswahl zwischen folgenden Werten:eval: Einzelne Ausdrücke werden mit eval evaluiert.exec: Codeblöcke werden mit exec ausgewertet.single: Für einzelne, interaktive Statements nutzen Sie single.
flags ja Hier können Sie angeben, wie die Quelle genau kompiliert werden soll. Für die allermeisten Anwendungsfälle können Sie das Flag aber ignorieren.
dont_inherit ja Genau wie flag dient der Parameter dont_inherit dazu, die Kompilierung Ihrer Quelle zu spezifizieren.
optimize ja Im Parameter optimize können Sie das Optimierungsniveau Ihres Kompiliervorgangs bestimmen.

Anwendung von Python Compile

Um sich zu veranschaulichen, wie Python Compile funktioniert, ist ein Codebeispiel hilfreich:

codeAsString = 'x = 10\ny = 7\nres = x * y\nprint("result = ", res)'
codeObject = compile(codeAsString, ' ', 'exec')
exec(codeObject)

Zunächst definieren Sie die Variable namens codeAsString, in der folgender, einfacher Python-Code als Python String gespeichert wird:

x = 10
y = 7
res = x * y
print("result = ", res)

Lassen Sie sich nicht von den „\n“s im String codeAsString verwirren: Hierbei handelt es sich um das Steuerzeichen, das einen Zeilenumbruch markiert. Wie Sie sehen, können Sie Ihren Python-Code also einfach als Zeichenkette in einer herkömmlichen Variable hinterlegen. Um nun aber dafür zu sorgen, dass der Code nicht einfach nur als eine einfache Zeichenkette interpretiert wird, benötigen Sie die Compile-Funktion. Der Aufruf der Compile-Funktion im obigen Beispiel nutzt nur die erforderlichen Parameter.

Zunächst übergeben Sie das, was kompiliert werden soll, nämlich Ihren String. Anschließend spezifizieren Sie die Dateiquelle Ihres Strings. Da der String direkt im Code definiert und nicht aus einer Datei gelesen wurde, reicht es, die leere Zeichenkette anzugeben. Sie können theoretisch aber jede Zeichenkette Ihrer Wahl nutzen.

Der letzte Parameter ist wieder spannend: Da es sich bei unserem String codeAsString, wie die Auflösung des Strings im zweiten Codebeispiel zeigt, um einen ganzen Codeblock handelt, nutzen wir den Parameter exec. Denken Sie daran, dass es sich hier um einen String handelt, und vergessen Sie die Anführungszeichen nicht.

Das Ergebnis der Python-Compile-Funktion wird im obigen Codebeispiel der Variable namens codeObjekt zugewiesen. Diese enthält jetzt genau das, was ihr Name vermuten lässt: ein Code-Objekt. Das Besondere an einem Code-Objekt ist, dass Sie es jederzeit mit einem Aufruf von Pythons exec-Funktion ausführen können. Genau das geschieht in der letzten Codezeile, sodass das Programm am Ende „result = 70“ ausgeben wird.

Kompilieren einer einzigen Anweisung

Wenn Sie nur eine einzige Codeanweisung kompilieren möchten, müssen Sie den dritten Parameter beim Funktionsaufruf von Python Compile anpassen. Das liegt daran, dass für einzelne Anweisungen der Modus eval genutzt wird. Auch hier hilft ein Beispiel:

singleInstruction = 'print("Hello World!")'
codeObject = compile(singleInstruction, ' ', 'eval')
exec(codeObject)

Im Grunde hat sich hier nicht viel verändert. Noch immer wird ein String mit Python-Code erstellt. Im Gegensatz zum vorherigen Beispiel enthält der String in diesem Fall aber nur eine einzelne Python-Print-Anweisung. Das erfordert die Nutzung des eval-Modus, der für die Auswertung einzelner Instruktionen genutzt wird.

Wenn Sie nun erneut Ihr Code-Objekt mithilfe der exec-Funktion ausführen, werden Sie sehen, dass alles funktioniert wie erwartet. Ihr Programm gibt „Hello World!“ auf dem Bildschirm aus.

Quellcode aus Dateiquellen verarbeiten

In den bisherigen Beispielen haben wir den Quellcode, den die Python-Compile-Funktion bearbeiten sollte, immer im Programm selbst als String definiert. Doch was ist, wenn Sie eine Datei haben, die Code beinhaltet, den Sie in Ihrem Programm ausführen möchten? Auch hierfür können Sie die Python Compile nutzen.

Nehmen wir an, Sie haben eine Datei namens testcode.py, die einen ausführbaren Python-Code enthält, und möchten diesen nun in Ihrem Programm ausführen:

tmpFile = open('testcode.py', 'r')
tmpCode = tmpFile.read()
tmpFile.close()
codeObject = compile(tmpCode, 'testcode.py', 'exec')
exec(codeObject)

Zunächst müssen Sie den Code, den Sie ausführen möchten, aus der Datei lesen, in der er sich aktuell befindet. Hierfür öffnen Sie die Datei mit Pythons open-Funktion und mit Lesezugriff. Anschließend können Sie Python Read nutzen, um den Quellcode in Ihre Variable namens tmpCode einzulesen, und die anfangs geöffnete Datei wieder schließen.

Nun folgt der Aufruf von Python Compile. An dieser Stelle ist es wichtig, dass Sie angeben, woher Sie den Code, den Sie kompilieren möchten, bekommen haben – in diesem Fall aus der Datei testcode.py. Im Anschluss ähnelt unser Programm den vorherigen Beispielen, und mit dem abschließenden Aufruf von exec führen Sie den Code aus testcode.py schlussendlich in Ihrem Programm aus.