Python exec ()

De exec () - methode voert het dynamisch gemaakte programma uit, dat ofwel een string ofwel een code-object is.

De syntaxis van exec():

 exec (object, globals, locals)

exec () Parameters

exec() heeft drie parameters:

  • object - Ofwel een tekenreeks of een codeobject
  • globals (optioneel) - een woordenboek
  • locals (optioneel) - een mapping-object. Woordenboek is het standaard en meest gebruikte toewijzingstype in Python.

Het gebruik van globals en locals komt later in het artikel aan de orde.

Retourwaarde van exec ()

exec()retourneert geen waarde, het keert terug None.

Voorbeeld 1: hoe exec () werkt?

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

Uitvoer

 Som = 15

Hier wordt het string-objectprogramma doorgegeven exec()waaraan het programma wordt uitgevoerd. globals en locals worden in dit geval weggelaten.

Voorbeeld 2: Sta de gebruiker toe om input te leveren

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

Uitvoer

 Voer een programma in: (print (item) voor item in (1, 2, 3)) 1 2 3

Als je Python-code van de gebruiker wilt nemen die meerregelige code (using '') toestaat , kun je de compile()methode gebruiken voordat je deze gebruikt exec().

Meer informatie over de methode compile () in Python.

Wees voorzichtig bij het gebruik van exec ()

Beschouw een situatie, u gebruikt een Unix-systeem (macOS, Linux enz.) En u hebt een geïmporteerde osmodule. De os-module biedt een draagbare manier om functies van het besturingssysteem te gebruiken, zoals het lezen of schrijven van een bestand.

Als u gebruikers toestaat een waarde in te voeren met exec(input()), kan de gebruiker opdrachten geven om het bestand te wijzigen of zelfs alle bestanden te verwijderen met de opdracht os.system('rm -rf *').

Als u exec(input())in uw code gebruikt, is het een goed idee om te controleren welke variabelen en methoden de gebruiker kan gebruiken. U kunt zien welke variabelen en methoden beschikbaar zijn met de methode dir ().

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

Uitvoer

('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', 'graden', 'e', ​​'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'faculteit', ' floor ',' fmod ',' frexp ',' fsum ',' gamma ',' gcd ',' get_ipython ',' hypot ',' inf ',' isclose ',' isfinite ',' isinf ',' isnan ' , 'ldexp', 'lgamma ',' log ',' log10 ',' log1p ',' log2 ',' modf ',' nan ',' pi ',' pow ',' quit ',' radialen ',' sin ',' sinh ' , 'sqrt', 'tan', 'tanh', 'trunc')

Het gebruik van beschikbare methoden en variabelen beperken in exec ()

Vaker wel dan niet zijn alle beschikbare methoden en variabelen die worden gebruikt exec()misschien niet nodig, of hebben ze zelfs een beveiligingslek. U kunt het gebruik van deze variabelen en methoden beperken door optionele globale en lokale parameters (woordenboeken) door te geven aan de exec()methode.

1. Zowel globale als lokale parameters worden weggelaten

Als beide parameters worden weggelaten (zoals in onze eerdere voorbeelden), wordt de code die naar verwachting wordt uitgevoerd door, exec()uitgevoerd in het huidige bereik. U kunt de beschikbare variabelen en methoden controleren met de volgende code:

 exec ('print (dir ())')

2. Globalsparameter doorgeven; locals parameter is weggelaten

De globale en lokale parameters (woordenboeken) worden gebruikt voor respectievelijk globale en lokale variabelen. Als het woordenboek van de lokale bevolking wordt weggelaten, wordt standaard het woordenboek globaal gebruikt. Dit betekent dat globalen worden gebruikt voor zowel globale als lokale variabelen.

Opmerking: je kunt het huidige globale en lokale woordenboek in Python controleren met respectievelijk de ingebouwde methoden globals () en locals ().

3. Leeg woordenboek doorgeven als globale parameter

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

Als u een leeg woordenboek als globalen doorgeeft, zijn alleen de __builtins__beschikbaar voor de object(eerste parameter van exec ()). Ook al hebben we een wiskundige module geïmporteerd in het bovenstaande programma, het proberen toegang te krijgen tot een van de functies die door de wiskundige module worden geboden, zal een uitzondering opleveren.

Uitvoer

 ('__builtins__')

Bepaalde methoden beschikbaar maken

 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 kunnen slechts twee ingebouwde methoden print () en dir () worden uitgevoerd per exec()methode.

Het is belangrijk op te merken dat, exec()de code uitvoert en geen waarde retourneert (retourneert None). Daarom kunt u geen return- en yield-instructies gebruiken buiten de functiedefinities.

Interessante artikelen...