English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Python-intern definierte Funktionen
exec() führt dynamisch erstellte Programme aus, die entweder Zeichenketten oder Code-Objekte sein können.
Syntax von exec()
exec(object, globals, locals)
exec() nimmt drei Parameter an:
Objekt -Zeichenkette oder Code-Objekt
globals (Optional)-Dictionary
locals(Optional)-Mapping-Objekt. Das Dictionary ist ein häufig verwendeter Standard-Mapping-Typ in Python.
werden später in diesem Artikel besprochenGlobale Variablen(globals) und (locals)LokalVariableVerwendung.
exec() gibt keine Werte zurück, es gibt None zurück.
program = 'a =' 5\nb=10\nprint("Sum =", a+b)' exec(program)
Beim Ausführen des Programms wird als Ausgabe ausgegeben:
Sum = 15
Hier wird das String-Objekt 'program' an exec() übergeben, um das Programm auszuführen. In diesem Beispiel werden globale Variablen (globals) und (locals)lokale Variablen.
program = input('Eingabeprogramm:') exec(program)
Beim Ausführen des Programms wird als Ausgabe ausgegeben:
Eingabeprogramm: [print(item) for item in [1, 2, 3]] 1 2 3
Wenn Sie Python-Code von einem Benutzer erhalten, der mehrere Zeilen Code verwenden kann ('\n'), können Sie die Methode compile() vor exec() verwenden.
Erfahren Sie mehr übercompile() - Methode in PythonMehr Informationen.
Denken Sie daran, dass Sie ein Unix-System (macOS, Linux usw.) verwenden und das os-Modul importiert haben. Das os-Modul bietet eine tragbare Methode, um Betriebssystemfunktionen zu verwenden, z.B.: Dateien lesen oder schreiben.
Wenn der Benutzer die Verwendung von exec(input()) erlaubt ist, kann der Benutzer Befehle ausführen, um Dateien zu ändern, und kann sogar mit command alle Dateien löschen os.system('rm -rf *).
Wenn Sie in Ihrem Code exec(input()) verwenden, ist es am besten zu überprüfen, welche Variablen und Methoden der Benutzer verwenden kann. Sie könnendir() - MethodeAnzeigen Sie die verfügbaren Variablen und Methoden.
from math import * exec('print(dir())')
Beim Ausführen des Programms wird als Ausgabe ausgegeben:
['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__name__', '_dh', '_i', '_i1', '_i2', '_ih', '_ii', '_iii', '_oh', '_sh', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'get_ipython', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log'1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'quit', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc'
Normalerweise ist es nicht erforderlich, alle verfügbaren Methoden und Variablen in exec() zu verwenden, es könnte sogar Sicherheitslücken geben. Man kann die optionalenglobalsundlocalsParameter (Dictionary) werden an das exec() Methode übergeben, um die Verwendung dieser Variablen und Methoden zu begrenzen.
Wenn beide Parameter weggelassen werden (wie in unserem Beispiel zuvor), wird exec() erwarten, dass der zu executingen Code im aktuellen Bereich ausgeführt wird. Man kann mit folgendem Code verfügbare Variablen und Methoden überprüfen:
exec('print(dir())')
(globals) und (locals)Parameter(Dictionary),wird getrennt für globale und lokale Variablen verwendet. Wenn daslocalsDas Dictionary, wenn kein Dictionary übergeben wird, wird standardmäßigglobalsDas bedeutet,Globale Variablen(globals)wird für globale und lokale Variablen verwendet.
Hinweis:Man kann sie getrennt verwendenglobals()undlocals()Built-in Methoden in Python überprüfen den aktuellen globalen und lokalen Dictionary.
from math import * exec('print(dir())', {}) # Dieser Code wird eine Ausnahme verursachen # exec('print(sqrt('9))', {}
wenn ein leerer Dictionary alsglobalswird übergeben, ist nur __builtins__ für das object (den ersten Parameter von exec()) verfügbar. Selbst wenn wir im obigen Programm das math Modul importiert haben, versuchen, aufmath ModulJegliche von ihnen bereitgestellte Funktion kann eine Ausnahme verursachen.
Beim Ausführen des Programms wird als Ausgabe ausgegeben:
__builtins__
from math import * exec('print(dir())', {'sqrt': sqrt, 'pow': pow}) # Der Objekt kann den sqrt() Modul haben exec('print(sqrt('9))', {'sqrt': sqrt, 'pow': pow})
Hier kann der von exec() ausgeführte Code auch Methoden wie sqrt() und pow() sowie __builtins__ haben.
können Sie nach Belieben den Namen der Methode ändern.
from math import * exec('print(dir())', {'squareRoot': sqrt, 'pow': pow}) # Ein Objekt kann das squareRoot() Modul haben exec('print(squareRoot(9))', {'squareRoot': sqrt, 'pow': pow})
Im obigen Programm berechnet squareRoot() den Quadratwurzelwert (ähnliche Funktionen wie sqrt()). Der Versuch, sqrt() zu verwenden, führt jedoch zu einer Ausnahme.
Sie können die Verwendung von __builtins__ einschränken, indem Sie __builtins__ im globals-Dictionary auf None setzen.
exec(object, {'__builtins__': None})
Sie könnenLokal(lokale)Dictionaries, um benötigte Funktionen und Variablen verfügbar zu machen. Zum Beispiel:
from math import * globalsParameter = {'__builtins__': None} localsParameter = {'print': print, 'dir': dir} exec('print(dir())', globalsParameter, localsParameter)
Beim Ausführen des Programms wird als Ausgabe ausgegeben:
['dir', 'print']
Hier kann die exec()-Methode nur zwei eingebauten Methoden ausführenprint()unddir()
Besonders zu beachten ist, dass exec() Code ausführt und keinen Wert zurückgibt (rückgibt None). Daher können Sie return undyieldAnweisung.