Python exec ()

Metoda exec () izvršava dinamički stvoreni program koji je ili niz ili objekt koda.

Sintaksa exec():

 exec (objekt, globalno, lokalno stanovništvo)

parametri exec ()

exec() uzima tri parametra:

  • objekt - Ili niz ili objekt koda
  • globali (neobavezno) - rječnik
  • lokalno stanovništvo (nije obavezno) - objekt za mapiranje. Rječnik je standardni i često korišteni tip mapiranja u Pythonu.

Korištenje globalnih i lokalnih stanovnika bit će razmotreno kasnije u članku.

Povratna vrijednost iz exec ()

exec()ne vraća nikakvu vrijednost, vraća None.

Primjer 1: Kako exec () radi?

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

Izlaz

 Zbroj = 15

Ovdje se prenosi program objektnog niza exec()kojem se izvršava program. u ovom su slučaju izostavljeni globalni i domaći stanovnici.

Primjer 2: Dopustite korisniku da unese unos

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

Izlaz

 Unesite program: (ispis (stavka) za stavku u (1, 2, 3)) 1 2 3

Ako želite uzeti Python kôd od korisnika koji dopušta višeredni kôd (pomoću ''), compile()prije upotrebe možete koristiti metodu exec().

Saznajte više o metodi compile () u Pythonu.

Budite oprezni dok koristite exec ()

Razmotrite situaciju, koristite Unix sustav (macOS, Linux itd.) I uvezli ste osmodul. Os modul pruža prijenosni način korištenja funkcionalnosti operativnog sustava poput čitanja ili pisanja datoteke.

Ako dopustite korisnicima da unose vrijednost pomoću exec(input()), korisnik može izdavati naredbe za promjenu datoteke ili čak brisanje svih datoteka pomoću naredbe os.system('rm -rf *').

Ako koristite exec(input())svoj kod, dobra je ideja provjeriti koje varijable i metode korisnik može koristiti. Pomoću metode dir () možete vidjeti koje su varijable i metode dostupne.

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

Izlaz

('Ulaz', 'Izlaz', '_', '__', '___', '__builtin__', '__builtins__', '__ime__', '_dh', '_i', '_i1', '_i2', ' _ih ',' _ii ',' _iii ',' _oh ',' _sh ',' acos ',' acosh ',' asin ',' asinh ',' atan ',' atan2 ',' atanh ',' ceil ' , 'copysign', 'cos', 'cosh', 'stupnjevi', 'e', ​​'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'factorial', ' kat ',' 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')

Ograničenje upotrebe dostupnih metoda i varijabli u exec ()

Češće nego ne, sve dostupne metode i varijable korištene u exec()možda neće biti potrebne, ili čak mogu imati sigurnosnu rupu. Upotrebu ovih varijabli i metoda možete ograničiti dodavanjem neobaveznih globalnih i lokalnih parametara (rječnika) exec()metodi.

1. Izostavljeni su i globalni i lokalni parametri

Ako su oba parametra izostavljena (kao u našim ranijim primjerima), kôd za koji se očekuje da će se izvršiti exec()izvršava se u trenutnom opsegu. Dostupne varijable i metode možete provjeriti pomoću sljedećeg koda:

 exec ('print (dir ())')

2. Prolazni globalni parametar; parametar lokalno stanovništvo je izostavljen

Globalni i lokalni parametri (rječnici) koriste se za globalne i lokalne varijable. Ako je lokalni rječnik izostavljen, zadani je globalni rječnik. Znači, globali će se koristiti i za globalne i za lokalne varijable.

Napomena: Trenutni globalni i lokalni rječnik u Pythonu možete provjeriti pomoću ugrađenih metoda globals () i local ().

3. Prosljeđivanje praznog rječnika kao globalnog parametra

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

Ako proslijedite prazan rječnik kao globalni, samo __builtins__su dostupni object(prvi parametar exec ()). Iako smo uveli matematički modul u gornji program, pokušaj pristupa bilo kojoj funkciji koju pruža matematički modul stvorit će iznimku.

Izlaz

 ('__izgrađeni__')

Omogućavanje dostupnosti određenih metoda

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

Ovdje kôd koji izvršava exec () također može imati sqrt()i pow()metode zajedno s __builtins__.

Moguće je promijeniti naziv metode prema vašoj želji.

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

U gornjem programu squareRoot()izračunava kvadratni korijen (slična funkcionalnost poput sqrt()). Međutim, pokušaj upotrebe sqrt()stvorit će iznimku.

Ograničavanje upotrebe ugrađenih datoteka

Možete ograničiti uporabu __builtins__dajući vrijednosti Nonedo '__builtins__'u globals rječniku.

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

4. Usvajanje rječnika za globale i lokalno stanovništvo

Potrebne funkcije i varijable možete učiniti dostupnim za upotrebu dodavanjem rječnika lokalnog stanovništva. Na primjer:

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

Izlaz

 ('dir', 'print') 

Ovdje se samo dvije ugrađene metode print () i dir () mogu izvršiti exec()metodom.

Važno je napomenuti da, exec()izvršava kôd i ne vraća nikakvu vrijednost (vraća None). Stoga ne možete koristiti naredbe return i yield izvan definicija funkcije.

Zanimljivi članci...