2016-10-15 3 views
1

Ich schreibe einen privaten Online-Python-Interpreter für VK, die Idle-Konsole nah simulieren würde. Nur ich und einige Leute in der Whitelist könnten diese Funktion nutzen, keinen unsicheren Code, der meinem Server schaden könnte. Aber ich habe ein kleines Problem. Zum Beispiel sende ich die Zeichenfolge mit Code def foo():, und ich möchte nicht SyntaxError erhalten, sondern weiterhin Zeile für Zeile definieren, ohne lange Zeichenfolgen mit der Verwendung von \n zu schreiben. exec() und eval() passt mir in diesem Fall nicht. Was sollte ich verwenden, um den gewünschten Effekt zu erzielen? Sorry, wenn Duplikate, bekomme es immer noch nicht von ähnlichen Fragen.Python-Simulationsmodus interaktiv

Antwort

2

Die Python-Standardbibliothek enthält die Module code und codeop, die Ihnen dabei helfen. Das code Modul nur straight-up simuliert den interaktiven Standardinterpreter:

import code 
code.interact() 

es auch ein paar Einrichtungen für detailliertere Kontrolle und Anpassung bietet, wie es funktioniert.

Wenn Sie die Dinge bauen von mehr Basiskomponenten wollen, bietet das codeop Modul einen Befehl Compiler, der __future__ Aussagen und erkennt unvollständige Befehle erinnert sich:

import codeop 
compiler = codeop.CommandCompiler() 

try: 
    codeobject = compiler(some_source_string) 
    # codeobject is an exec-utable code object if some_source_string was a 
    # complete command, or None if the command is incomplete. 
except (SyntaxError, OverflowError, ValueError): 
    # If some_source_string is invalid, we end up here. 
    # OverflowError and ValueError can occur in some cases involving invalid literals.