Python exec ()

Metoda exec () execută programul creat dinamic, care este fie un șir, fie un obiect de cod.

Sintaxa exec():

 exec (obiect, globali, localnici)

exec () Parametri

exec() ia trei parametri:

  • obiect - Fie un șir, fie un obiect de cod
  • globals (opțional) - un dicționar
  • localnici (opțional) - un obiect de cartografiere. Dicționarul este tipul de mapare standard și utilizat în mod obișnuit în Python.

Utilizarea globalilor și a localnicilor va fi discutată mai târziu în articol.

Valoare returnată din exec ()

exec()nu returnează nicio valoare, se întoarce None.

Exemplul 1: Cum funcționează exec ()?

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

Ieșire

 Suma = 15

Aici, programul de obiecte șir este trecut la exec()care execută programul. globali și localnici sunt omiși în acest caz.

Exemplul 2: permiteți utilizatorului să furnizeze date de intrare

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

Ieșire

 Introduceți un program: (tipăriți (articol) pentru articolul din (1, 2, 3)) 1 2 3

Dacă doriți să luați codul Python de la utilizator, care permite codul multilinie (folosind ''), puteți utiliza compile()metoda înainte de a utiliza exec().

Aflați mai multe despre metoda compile () în Python.

Fii atent în timp ce folosești exec ()

Luați în considerare o situație, utilizați un sistem Unix (macOS, Linux etc.) și ați importat osmodulul. Modulul OS oferă o modalitate portabilă de a utiliza funcționalitățile sistemului de operare, cum ar fi citirea sau scrierea unui fișier.

Dacă permiteți utilizatorilor să introducă o valoare utilizând exec(input()), utilizatorul poate emite comenzi pentru a schimba fișierul sau chiar a șterge toate fișierele folosind comanda os.system('rm -rf *').

Dacă utilizați exec(input())codul dvs., este o idee bună să verificați ce variabile și metode poate folosi utilizatorul. Puteți vedea ce variabile și metode sunt disponibile utilizând metoda dir ().

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

Ieșire

(„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', 'gradi', 'e', ​​'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'factorial', ' etaj ',' 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')

Restricționarea utilizării metodelor și variabilelor disponibile în exec ()

De cele mai multe ori, toate metodele disponibile și variabilele utilizate exec()pot să nu fie necesare sau chiar să aibă o gaură de securitate. Puteți restricționa utilizarea acestor variabile și metode trecând parametrii globali și localnici opționali (dicționare) la exec()metodă.

1. Ambii parametri globali și localnici sunt omiși

Dacă ambii parametri sunt omiși (ca în exemplele noastre anterioare), codul așteptat să fie executat de exec()este executat în domeniul de aplicare curent. Puteți verifica variabilele și metodele disponibile folosind următorul cod:

 exec ('print (dir ())')

2. Parametrul global de trecere; parametrul localnici este omis

Parametrii globali și localnici (dicționare) sunt utilizați pentru variabilele globale și, respectiv, locale. Dacă dicționarul local este omis, acesta va fi implicit dicționar global. Adică, globalele vor fi utilizate atât pentru variabilele globale, cât și pentru cele locale.

Notă: Puteți verifica dicționarul global și local curent în Python folosind metode încorporate global () și localnici ().

3. Trecerea dicționarului gol ca parametru global

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

Dacă treceți un dicționar gol ca global, numai cele __builtins__sunt disponibile pentru object(primul parametru pentru exec ()). Chiar dacă am importat modulul matematic în programul de mai sus, încercarea de a accesa oricare dintre funcțiile oferite de modulul matematic va ridica o excepție.

Ieșire

 („__builtins__”)

Punerea la dispoziție a anumitor metode

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

Aici, codul executat de exec () poate avea sqrt()și pow()metode împreună cu __builtins__.

Este posibil să schimbați numele metodei în funcție de dorința dvs.

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

În programul de mai sus, squareRoot()calculează rădăcina pătrată (funcționalitate similară ca sqrt()). Cu toate acestea, încercarea de utilizare sqrt()va ridica o excepție.

Restricționarea utilizării elementelor încorporate

Puteți restricționa utilizarea __builtins__prin acordarea de valoare Nonecătre cele '__builtins__'în dicționar GLOBALS.

 exec (obiect, ('__builtins__': Nici unul)) 

4. Trecerea dicționarului global și localnic

Puteți pune la dispoziție funcțiile și variabilele necesare folosind dicționarul localnicilor. De exemplu:

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

Ieșire

 ('dir', 'print') 

Aici, numai două metode încorporate print () și dir () pot fi executate prin exec()metodă.

Este important să rețineți că, exec()execută codul și nu returnează nicio valoare (returnează None). Prin urmare, nu puteți utiliza instrucțiunile return și yield în afara definițiilor funcției.

Articole interesante...