Python exec ()

Die Methode exec () führt das dynamisch erstellte Programm aus, das entweder eine Zeichenfolge oder ein Codeobjekt ist.

Die Syntax von exec():

 exec (Objekt, Globale, Einheimische)

exec () Parameter

exec() nimmt drei Parameter:

  • Objekt - Entweder eine Zeichenfolge oder ein Codeobjekt
  • Globals (optional) - ein Wörterbuch
  • Einheimische (optional) - ein Zuordnungsobjekt. Wörterbuch ist der Standard- und häufig verwendete Zuordnungstyp in Python.

Die Verwendung von Globalen und Einheimischen wird später in diesem Artikel erörtert.

Rückgabewert von exec ()

exec()gibt keinen Wert zurück, es gibt zurück None.

Beispiel 1: Wie funktioniert exec ()?

 program = 'a = 5b=10print("Sum =", a+b)' exec(program)

Ausgabe

 Summe = 15

Hier wird das String-Objektprogramm übergeben, an exec()das das Programm ausgeführt wird. Globale und Einheimische werden in diesem Fall weggelassen.

Beispiel 2: Benutzer kann Eingaben vornehmen

  program = input('Enter a program:') exec(program) 

Ausgabe

 Geben Sie ein Programm ein: (Drucken (Element) für Element in (1, 2, 3)) 1 2 3

Wenn Sie dem Benutzer Python-Code entnehmen möchten, der mehrzeiligen Code (using '') zulässt , können Sie vor der Verwendung die compile()Methode verwenden exec().

Weitere Informationen zur compile () -Methode in Python.

Seien Sie vorsichtig bei der Verwendung von exec ()

Stellen Sie sich eine Situation vor, Sie verwenden ein Unix-System (macOS, Linux usw.) und haben ein osModul importiert . Das Betriebssystemmodul bietet eine tragbare Möglichkeit, Betriebssystemfunktionen wie das Lesen oder Schreiben einer Datei zu verwenden.

Wenn Sie Benutzern erlauben, einen Wert mit einzugeben exec(input()), kann der Benutzer Befehle zum Ändern der Datei oder sogar zum Löschen aller Dateien mit dem Befehl ausgeben os.system('rm -rf *').

Wenn Sie exec(input())in Ihrem Code verwenden, sollten Sie überprüfen, welche Variablen und Methoden der Benutzer verwenden kann. Mit der Methode dir () können Sie sehen, welche Variablen und Methoden verfügbar sind.

 from math import * exec('print(dir())')

Ausgabe

('In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__name__', '_dh', '_i', '_i1', '_i2', ' _ih ',' _ii ',' _iii ',' _oh ',' _sh ',' acos ',' acosh ',' asin ',' asinh ',' atan ',' atan2 ',' atanh ',' lid ' , 'Copysign', 'cos', 'cosh', 'Grad', 'e', ​​'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'Fakultät', ' Etage ',' fmod ',' frexp ',' fsum ',' gamma ',' gcd ',' get_ipython ',' hypot ',' inf ',' isclose ',' isfinite ',' isinf ',' isnan ' , 'ldexp', 'lgamma ',' log ',' log10 ',' log1p ',' log2 ',' modf ',' nan ',' pi ',' pow ',' quit ',' radians ',' sin ',' sinh ' , 'sqrt', 'tan', 'tanh', 'trunc')

Einschränkung der Verwendung verfügbarer Methoden und Variablen in exec ()

In den meisten Fällen werden exec()möglicherweise nicht alle verfügbaren Methoden und Variablen benötigt oder weisen sogar eine Sicherheitslücke auf. Sie können die Verwendung dieser Variablen und Methoden einschränken, indem Sie optionale globale und lokale Parameter (Wörterbücher) an exec()method übergeben.

1. Sowohl globale als auch lokale Parameter werden weggelassen

Wenn beide Parameter weggelassen werden (wie in unseren früheren Beispielen), wird der Code, von dem erwartet wird, dass er ausgeführt exec()wird, im aktuellen Bereich ausgeführt. Sie können die verfügbaren Variablen und Methoden mit dem folgenden Code überprüfen:

 exec ('print (dir ())')

2. Übergeben des globalen Parameters; Der Parameter local wird weggelassen

Die globalen und lokalen Parameter (Wörterbücher) werden für globale bzw. lokale Variablen verwendet. Wenn das lokale Wörterbuch weggelassen wird, wird standardmäßig das globale Wörterbuch verwendet. Das heißt, Globale werden sowohl für globale als auch für lokale Variablen verwendet.

Hinweis: Sie können das aktuelle globale und lokale Wörterbuch in Python mit den integrierten Methoden globals () und local () überprüfen.

3. Leeres Wörterbuch als globalen Parameter übergeben

 from math import * exec('print(dir())', ()) # This code will raise an exception # exec('print(sqrt(9))', ())

Wenn Sie ein leeres Wörterbuch als Globals übergeben, stehen nur __builtins__die object(erster Parameter für exec ()) zur Verfügung. Obwohl wir im obigen Programm ein Mathematikmodul importiert haben, löst der Versuch, auf eine der vom Mathematikmodul bereitgestellten Funktionen zuzugreifen, eine Ausnahme aus.

Ausgabe

 ('__builtins__')

Bestimmte Methoden zur Verfügung stellen

 from math import * exec('print(dir())', ('sqrt': sqrt, 'pow': pow)) # object can have sqrt() module exec('print(sqrt(9))', ('sqrt': sqrt, 'pow': pow))

Here, the code that is executed by exec() can also have sqrt() and pow() methods along with __builtins__.

It's possible to change the name of the method according to your wish.

 from math import * exec('print(dir())', ('squareRoot': sqrt, 'pow': pow)) # object can have squareRoot() module exec('print(squareRoot(9))', ('squareRoot': sqrt, 'pow': pow))

In the above program, squareRoot() calculates the square root (similar functionality like sqrt()). However, trying to use sqrt() will raise an exception.

Restricting the Use of built-ins

You can restrict the use of __builtins__ by giving value None to the '__builtins__' in the globals dictionary.

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

4. Passing both globals and locals dictionary

You can make needed functions and variables available for use by passing locals dictionary. For example:

 from math import * globalsParameter = ('__builtins__' : None) localsParameter = ('print': print, 'dir': dir) exec('print(dir())', globalsParameter, localsParameter)

Output

 ('dir', 'print') 

Hier können nur zwei integrierte Methoden print () und dir () von der exec()Methode ausgeführt werden .

Es ist wichtig zu beachten, dass exec()der Code ausgeführt wird und kein Wert zurückgegeben wird (Rückgabe None). Daher können Sie keine return- und Yield-Anweisungen außerhalb der Funktionsdefinitionen verwenden.

Interessante Beiträge...