Ausführen von Python-Code in einer Zeichenfolge

8

Ich schreibe eine Spielengine mit pygame und box2d, und im Zeichengenerator möchte ich den Code schreiben können, der bei Keydown-Ereignissen ausgeführt wird.

Mein Plan war, im Zeichengenerator einen Texteditor zu haben, mit dem Sie Code ähnlich dem schreiben können:

%Vor%

Ich werde den Inhalt des Texteditors als Zeichenfolge abrufen und möchte, dass der Code in einer Methode in dieser Methode von Character ausgeführt wird:

%Vor%

Was ist der beste Weg, das zu tun?

    
Brad Zeis 18.06.2009, 20:55
quelle

4 Antworten

25

Sie können dazu die Methode eval(string) verwenden.

Definition

eval(code, globals=None, locals=None)
Der Code ist nur Standard-Python-Code - das bedeutet, dass er immer noch korrekt eingerückt sein muss.

Für die Globals kann ein benutzerdefiniertes __builtins__ definiert werden, was für Sicherheitszwecke nützlich sein könnte.

Beispiel

%Vor%

Würde hello auf die Konsole drucken. Sie können auch lokale und globale Variablen für den zu verwendenden Code angeben:

%Vor%

Sicherheitsbedenken

Sei aber vorsichtig. Jede Benutzereingabe wird ausgeführt. Überlegen Sie:

%Vor%

Dafür gibt es verschiedene Möglichkeiten. Am einfachsten ist es, etwas zu tun wie:

%Vor%

Das wird eine Ausnahme auslösen, anstatt Ihre Festplatte zu löschen. Während Ihr Programm Desktop ist, könnte dies ein Problem sein, wenn Leute Skripte neu verteilen, was ich mir vorstelle.

Seltsames Beispiel

Hier ist ein Beispiel für die Verwendung von eval ziemlich seltsam:

%Vor%

Was das in der Eval-Zeile bedeutet, ist:

  1. Gibt dem aktuellen Modul einen anderen Namen (es wird contrivedExample für das Skript). Der Konsument kann jetzt contrivedExample.hello() aufrufen.)
  2. Er definiert hi als Verweis auf hello
  3. Dieses Wörterbuch wurde mit der Liste der aktuellen Globals im ausführenden Modul kombiniert.

FAIL

Es stellt sich heraus (danke Kommentatoren!), dass Sie tatsächlich die exec -Anweisung verwenden müssen. Große Oops. Die überarbeiteten Beispiele sind wie folgt:

exec Definition

(Das kommt mir bekannt vor!) Exec ist eine Aussage:
exec "code" [in scope] Wo scope ist ein Wörterbuch der lokalen und globalen Variablen. Wenn dies nicht angegeben ist, wird es im aktuellen Bereich ausgeführt.

Der Code ist nur Standard-Python-Code - das bedeutet, dass er immer noch korrekt eingerückt sein muss.

exec Beispiel

%Vor%

Würde hello auf die Konsole drucken. Sie können auch lokale und globale Variablen für den zu verwendenden Code angeben:

%Vor%

exec Sicherheitsbedenken

Sei aber vorsichtig. Jede Benutzereingabe wird ausgeführt. Überlegen Sie:

%Vor%

Druckanweisung

Wie auch von Kommentatoren bemerkt, ist print eine Anweisung in allen Versionen von Python vor 3.0. In 2.6 kann das Verhalten durch Eingabe von from __future__ import print_statement geändert werden. Andernfalls verwenden Sie:

%Vor%

Anstelle von:

%Vor%     
Lucas Jones 18.06.2009, 20:57
quelle
2

Wie andere darauf hingewiesen haben, können Sie den Text in eine Zeichenfolge laden und exec "codestring" verwenden. Wenn es bereits in einer Datei enthalten ist, müssen Sie execfile nicht unbedingt laden.

Eine Leistungsbemerkung: Sie sollten es vermeiden, den Code mehrmals auszuführen, da das Parsen und Kompilieren der Python-Quelle ein langsamer Prozess ist. dh. nicht haben:

%Vor%

Sie können dies etwas verbessern, indem Sie die Quelle in ein Code-Objekt kompilieren (mit compile() und exec, oder besser, indem Sie eine Funktion erstellen, die Sie behalten und nur einmal erstellen. Entweder schreiben Sie den Benutzer " def my_handler (args ...) ", oder stelle es selbst vor und mache etwas wie:

%Vor%

Dann später:

%Vor%     
Brian 18.06.2009 21:12
quelle
0

eval oder exec. Sie sollten unbedingt die Python-Bibliotheksreferenz lesen, bevor Sie programmieren.

    
stepancheg 18.06.2009 20:58
quelle
0

Sie können eval()

verwenden     
anthony 18.06.2009 20:58
quelle

Tags und Links