English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Grundlegende Anleitung zu Python

Flusskontrolle in Python

Python Funktion

Python Datentypen

Dateioperationen in Python

Python Objekte und Klassen

Python Datum und Zeit

Hochwertiges Wissen über Python

Python Referenzhandbuch

Verwendung und Beispiel von Python exec()

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() Parameter

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.

Rückgabewert von exec()

exec() gibt keine Werte zurück, es gibt None zurück.

Beispiel1Wie funktioniert exec()?

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.

Beispiel2:Erlauben Sie dem Benutzer, Eingaben zu machen

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.

Seien Sie vorsichtig bei der Verwendung von exec()

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'

beschränken, die in exec() verwendet werden können

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.

1. Globale(globals) und lokale (locals) Parameter werden beide weggelassen

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())')

globalen Parameter übergeben; locals Parameter weglassen

(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.

Ein leeres Dictionary als globale Parameter übergeben

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__

bestimmte Methoden verfügbar machen

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.

Beschränkung der Verwendung eingebauter

Sie können die Verwendung von __builtins__ einschränken, indem Sie __builtins__ im globals-Dictionary auf None setzen.

exec(object, {'__builtins__': None})

3. Durch globale und lokale Dictionaries

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.

Python-intern definierte Funktionen