Python exec ()

Az exec () metódus végrehajtja a dinamikusan létrehozott programot, amely akár karakterlánc, akár kódobjektum.

A szintaxisa exec():

 exec (objektum, globálisok, helyiek)

exec () Paraméterek

exec() három paramétert vesz fel:

  • object - Vagy karakterlánc, vagy kódobjektum
  • globálok (opcionális) - szótár
  • helyiek (opcionális) - leképező objektum. A szótár a Python szabványos és gyakran használt leképezési típusa.

A globálisok és a helyiek használatát a cikk később tárgyalja.

Visszatérési érték az exec () értékéből

exec()nem ad vissza értéket, hanem visszatér None.

1. példa: Hogyan működik az exec ()?

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

Kimenet

 Összeg = 15

Itt adjuk át a string objektum programot, exec()amely végrehajtja a programot. a globálisokat és a helyieket ebben az esetben kihagyják.

2. példa: Engedélyezze a felhasználó számára a bemenet megadását

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

Kimenet

 Írjon be egy programot: (nyomtassa ki (elem) az (1, 2, 3) tételhez) 1 2 3

Ha Python kódot szeretne venni a felhasználótól, amely engedélyezi a többsoros kódot (használatával ''), akkor a compile()metódust használhatja a használat elõtt exec().

További információ a compile () metódusról a Pythonban.

Legyen óvatos az exec () használata közben

Vegyünk egy helyzetet: Unix rendszert (macOS, Linux stb.) Használ, és importálta a osmodult. Az os modul hordozható módon biztosítja az operációs rendszer funkcióinak használatát, például egy fájl olvasását vagy írását.

Ha engedélyezi a felhasználók számára, hogy értéket adjanak meg a használatával exec(input()), a felhasználó parancsokat adhat ki a fájl megváltoztatására, vagy akár az összes fájlt is törölheti a parancs segítségével os.system('rm -rf *').

Ha exec(input())a kódjában használja, érdemes ellenőrizni, hogy a felhasználó mely változókat és módszereket használhatja. A dir () metódus segítségével megnézheti, mely változók és módszerek érhetők el.

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

Kimenet

('In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__name__', '_dh', '_i', '_i1', '_i2', ' _ih ',' _ii ',' _iii ',' _oh ',' _sh ',' acos ',' acosh ',' asin ',' asinh ',' atan ',' atan2 ',' atanh ',' mennyezet ' , 'copysign', 'cos', 'cosh', 'fok', 'e', ​​'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'factorial', ' emelet ',' fmod ',' frexp ',' fsum ',' gamma ',' gcd ',' get_ipython ',' hipot ',' inf ',' isclose ',' isfinite ',' isinf ',' isnan ' , 'ldexp', 'lgamma ',' log ',' log10 ',' log1p ',' log2 ',' modf ',' nan ',' pi ',' pow ',' quit ',' radianus ',' sin ',' sinh ' , 'sqrt', 'tan', 'tanh', 'trunc')

A rendelkezésre álló módszerek és változók használatának korlátozása az exec () fájlban

Gyakran előfordulhat, hogy az összes rendelkezésre álló módszerre és változóra exec()nincs szükség, vagy akár biztonsági lyuk is lehet. Korlátozhatja ezeknek a változóknak és módszereknek a használatát, ha opcionális globális és lokális paramétereket (szótárakat) ad át a exec()metódusnak.

1. A globális és a lokális paraméterek egyaránt el vannak hagyva

Ha mindkét paraméter kihagyásra kerül (mint a korábbi példáinkban), akkor a várhatóan végrehajtandó kód exec()az aktuális hatókörben kerül végrehajtásra. A rendelkezésre álló változókat és módszereket a következő kód segítségével ellenőrizheti:

 exec ('print (dir ())')

2. Globális paraméter átadása; a localals paraméter kihagyásra kerül

A globális és a lokális paramétereket (szótárakat) a globális és a lokális változókhoz használják. Ha a helyiek szótárát kihagyja, az alapértelmezés szerint globális szótár. Jelentése: a globálisokat mind a globális, mind a lokális változókhoz használni fogjuk.

Megjegyzés: A globális (és a helyi) szótárat ellenőrizheti a Pythonban globals () és localals () beépített módszerekkel.

3. Üres szótár átadása globális paraméterként

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

Ha üres szótárat ad át globálisként, akkor csak __builtins__az object(az exec () első paramétere) érhető el . Annak ellenére, hogy a fenti programba importáltunk matematikai modult, a matematikai modul által biztosított funkciók bármelyikének megkísérlése kivételt jelent.

Kimenet

 ('__builtins__')

Bizonyos módszerek elérhetővé tétele

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

Itt az exec () által végrehajtott kód is rendelkezhet sqrt()és pow()metódusokkal együtt __builtins__.

Lehetőség van a módszer nevének megváltoztatására az Ön kívánsága szerint.

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

A fenti programban squareRoot()kiszámítja a négyzetgyököt (hasonló funkciók, mint például sqrt()). A használat megkísérlése azonban sqrt()kivételt jelent.

A beépítettek használatának korlátozása

Korlátozhatja a (z) használatát, __builtins__ha értéket Nonead '__builtins__'a globál szótárban.

 exec (objektum, ('__builtins__': Nincs)) 

4. A globális és a helyiek szótárának átadása

A szükséges funkciókat és változókat elérhetővé teheti a helyiek szótárának átadásával. Például:

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

Kimenet

 ('dir', 'print') 

Itt csak két beépített metódust lehet végrehajtani print () és dir () exec()módszerrel.

Fontos megjegyezni, hogy exec()végrehajtja a kódot, és nem ad vissza értéket (visszatér None). Ezért a return és hozam utasításokat nem használhatja a függvénydefiníciókon kívül.

érdekes cikkek...