Pythoni exec ()

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 osmooduli. 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.

Huvitavad Artiklid...