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 os
modul. 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 None
do '__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.