Exec () meetod käivitab dünaamiliselt loodud programmi, mis on kas string või koodiobjekt.
Süntaksi exec()
:
exec (objekt, globaalid, kohalikud)
exec () parameetrid
exec()
võtab kolm parameetrit:
- objekt - kas string või koodiobjekt
- globaalid (valikuline) - sõnastik
- kohalikud (valikuline) - kaardistamise objekt. Sõnastik on Pythonis tavaline ja tavaliselt kasutatav kaardistamise tüüp.
Globaalsete ja kohalike kasutamist käsitletakse edaspidi artiklis.
Execi tagastusväärtus ()
exec()
ei tagasta väärtust, vaid tagastab None
.
Näide 1: Kuidas exec () töötab?
program = 'a = 5b=10print("Sum =", a+b)' exec(program)
Väljund
Summa = 15
Siin edastatakse exec()
stringobjektiprogramm, millele programm käivitatakse. globaalid ja kohalikud on sel juhul välja jäetud.
Näide 2: lubage kasutajal sisestada
program = input('Enter a program:') exec(program)
Väljund
Sisestage programm: (printige üksus jaotises (1, 2, 3) olevale üksusele) 1 2 3
Kui soovite võtta kasutajalt Pythoni koodi, mis lubab mitmerealist koodi (kasutades ''
), võite compile()
enne kasutamist kasutada meetodit exec()
.
Lisateave meetodi compile () kohta Pythonis.
Exec () kasutamisel olge ettevaatlik
Mõelge olukorrale, kui kasutate Unixi süsteemi (macOS, Linux jne) ja olete importinud os
mooduli. OS-moodul pakub kaasaskantavat viisi operatsioonisüsteemi funktsioonide kasutamiseks, näiteks faili lugemiseks või kirjutamiseks.
Kui lubate kasutajatel sisestada väärtuse exec(input())
, võib kasutaja anda käske faili muutmiseks või käsu abil isegi kõik failid kustutada os.system('rm -rf *')
.
Kui kasutate exec(input())
oma koodis, on mõistlik kontrollida, milliseid muutujaid ja meetodeid kasutaja saab kasutada. Dir () meetodil näete, millised muutujad ja meetodid on saadaval.
from math import * exec('print(dir())')
Väljund
('In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__name__', '_dh', '_i', '_i1', '_i2', ' _ih ',' _ii ',' _iii ',' _oh ',' _sh ',' acos ',' acosh ',' asin ',' asinh ',' atan ',' atan2 ',' atanh ',' lagi ' , 'copysign', 'cos', 'cosh', 'kraadi', 'e', 'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'faktoriaal', ' korrus ',' fmod ',' frexp ',' fsum ',' gamma ',' gcd ',' get_ipython ',' hüpot ',' inf ',' isclose ',' isfinite ',' isinf ',' isnan ' , "ldexp", "lgamma ',' log ',' log10 ',' log1p ',' log2 ',' modf ',' nan ',' pi ',' pow ',' quit ',' radians ',' sin ',' sinh ' , 'sqrt', 'tan', 'tanh', 'trunc')
Saadaolevate meetodite ja muutujate piiramine rakenduses exec ()
Enamasti ei pruugi kõiki kasutatavaid saadaolevaid meetodeid ja muutujaid exec()
vaja minna või neil võib olla isegi turvaauk. Nende muutujate ja meetodite kasutamist saate piirata, edastades meetodile valikulised globaalide ja kohalike parameetrid (sõnastikud) exec()
.
1. Nii globaalsed kui ka kohalikud parameetrid jäetakse välja
Kui mõlemad parameetrid jäetakse välja (nagu meie varasemates näidetes), käivitatakse eeldatavalt täidetav kood exec()
praeguses ulatuses. Saate saadaolevaid muutujaid ja meetodeid kontrollida järgmise koodi abil:
exec ('print (dir ())')
2. globaalparameetri edastamine; kohalike parameeter on välja jäetud
The globals and locals parameters (dictionaries) are used for global and local variables respectively. If locals dictionary is omitted, it defaults to globals dictionary. Meaning, globals will be used for both global and local variables.
Note: You can check the current global and local dictionary in Python using globals() and locals() built-in methods respectively.
3. Passing empty dictionary as globals parameter
from math import * exec('print(dir())', ()) # This code will raise an exception # exec('print(sqrt(9))', ())
If you pass an empty dictionary as globals, only the __builtins__
are available to the object
(first parameter to the exec()). Even though we have imported math module in the above program, trying to access any of the functions provided by the math module will raise an exception.
Output
('__builtins__')
Making Certain Methods available
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')
Siin saab exec()
meetodi abil käivitada ainult kaks sisseehitatud meetodit print () ja dir () .
Oluline on märkida, et exec()
käivitab koodi ja ei tagasta väärtust (tagastab None
). Seetõttu ei saa funktsiooni definitsioonidest väljaspool väljundi return ja return väljendeid kasutada.