Python exec ()

Metoda exec () izvaja dinamično ustvarjen program, ki je bodisi niz bodisi predmet kode.

Sintaksa exec():

 exec (objekt, globalni, domačini)

parametri exec ()

exec() zajema tri parametre:

  • objekt - bodisi niz bodisi predmet kode
  • globals (neobvezno) - slovar
  • domačini (neobvezno) - objekt za preslikavo. Slovar je standardni in pogosto uporabljeni tip preslikave v Pythonu.

O uporabi globalov in domačinov bomo govorili kasneje v članku.

Vrnjena vrednost iz exec ()

exec()ne vrne nobene vrednosti, vrne None.

Primer 1: Kako deluje exec ()?

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

Izhod

 Vsota = 15

Tu se posreduje program nizov, exec()ki izvaja program. globalni in domačini so v tem primeru izpuščeni.

Primer 2: Dovoli uporabniku, da vnese podatke

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

Izhod

 Vnesite program: (natisnite (element) za element v (1, 2, 3)) 1 2 3

Če želite uporabniku vzeti kodo Python, ki omogoča večvrstno kodo (z uporabo ''), lahko compile()pred uporabo uporabite metodo exec().

Preberite več o metodi compile () v Pythonu.

Bodite previdni pri uporabi exec ()

Razmislite o situaciji, če uporabljate sistem Unix (macOS, Linux itd.) In ste uvozili osmodul. Modul os ponuja prenosni način uporabe funkcij operacijskega sistema, kot je branje ali pisanje datoteke.

Če dovolite uporabnikom, da vnesejo vrednost z uporabo exec(input()), lahko uporabnik izda ukaze za spremembo datoteke ali celo brisanje vseh datotek z uporabo ukaza os.system('rm -rf *').

Če exec(input())v svoji kodi uporabljate, je dobro preveriti, katere spremenljivke in metode lahko uporabnik uporablja. Katere spremenljivke in metode so na voljo, lahko vidite z metodo dir ().

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

Izhod

('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', 'stopinje', 'e', ​​'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'factorial', ' nadstropje ',' fmod ',' frexp ',' fsum ',' gama ',' gcd ',' get_ipython ',' hipot ',' inf ',' isclose ',' isfinite ',' isinf ',' isnan ' , 'ldexp', 'lgamma ',' log ',' log10 ',' log1p ',' log2 ',' modf ',' nan ',' pi ',' pow ',' quit ',' radians ',' sin ',' sinh ' , 'sqrt', 'tan', 'tanh', 'trunc')

Omejevanje uporabe razpoložljivih metod in spremenljivk v exec ()

Pogosteje vse razpoložljive metode in spremenljivke, uporabljene v, exec()morda ne bodo potrebne ali pa imajo celo varnostno luknjo. Uporabo teh spremenljivk in metod lahko omejite tako, da metodi posredujete neobvezne globalne in lokalne parametre (slovarje) exec().

1. Tako globalni kot lokalni parametri so izpuščeni

Če sta oba parametra izpuščena (kot v naših prejšnjih primerih), se koda, za katero se pričakuje, da se izvede exec(), izvede v trenutnem obsegu. Razpoložljive spremenljivke in metode lahko preverite z naslednjo kodo:

 exec ('print (dir ())')

2. podajanje globalnega parametra; parameter »domačini« je izpuščen

Za globalne in lokalne spremenljivke se uporabljata globalna in lokalna parametra (slovarji). Če je slovar domačinov izpuščen, je privzeto globalni slovar. Kar pomeni, da se bodo globalni uporabljali tako za globalne kot lokalne spremenljivke.

Opomba: Trenutni globalni in lokalni slovar v Pythonu lahko preverite z uporabo vgrajenih metod globals () in local ().

3. Posredovanje praznega slovarja kot globalnega parametra

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

Če posredujete prazen slovar kot globalno, __builtins__so objectparametru (prvi parameter na exec ()) na voljo samo. Čeprav smo v zgornji program uvozili matematični modul, bo poskus pri dostopu do katere koli funkcije, ki jo ponuja matematični modul, povzročil izjemo.

Izhod

 ('__builtins__')

Dajanje nekaterih metod na voljo

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

Tu ima lahko tudi kodo, ki jo izvaja exec (), sqrt()in pow()metode __builtins__.

Ime metode je mogoče spremeniti po vaši želji.

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

V zgornjem programu squareRoot()izračuna kvadratni koren (podobna funkcionalnost kot sqrt()). Vendar pa bo poskus uporabe sqrt()povzročil izjemo.

Omejevanje uporabe vgrajenih datotek

Uporabo lahko omejite __builtins__tako, Noneda '__builtins__'v slovarju globalno dodate vrednost .

 exec (objekt, ('__builtins__': Brez)) 

4. Prenos tako slovarja globalnega kot domačega jezika

S posredovanjem slovarja domačinov lahko omogočite potrebne funkcije in spremenljivke. Na primer:

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

Izhod

 ('dir', 'print') 

Tu lahko z exec()metodo izvedemo samo dve vgrajeni metodi print () in dir () .

Pomembno je vedeti, da exec()izvede kodo in ne vrne nobene vrednosti (vrne None). Zato ne morete uporabljati stavkov return in yield zunaj definicij funkcije.

Zanimive Članki...