Python exec ()

Metoden exec () kör det dynamiskt skapade programmet, som antingen är en sträng eller ett kodobjekt.

Syntaksen för exec():

 exec (objekt, globaler, lokalbefolkningen)

exec () Parametrar

exec() tar tre parametrar:

  • objekt - Antingen en sträng eller ett kodobjekt
  • globals (valfritt) - en ordlista
  • lokalbefolkningen (valfritt) - ett kartläggningsobjekt. Ordbok är den vanliga och vanliga kartläggningstypen i Python.

Användningen av globala och lokalbefolkningen kommer att diskuteras senare i artikeln.

Returvärde från exec ()

exec()returnerar inget värde, det returnerar None.

Exempel 1: Hur exec () fungerar?

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

Produktion

 Summa = 15

Här skickas strängobjektprogrammet till exec()vilket programmet körs. globala och lokalbefolkningen utelämnas i detta fall.

Exempel 2: Låt användaren tillhandahålla inmatning

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

Produktion

 Ange ett program: (skriv ut (objekt) för artikel i (1, 2, 3)) 1 2 3

Om du vill ta Python-kod från användaren som tillåter flerlinjekod (med '') kan du använda compile()metoden innan du använder exec().

Läs mer om compile () -metoden i Python.

Var försiktig när du använder exec ()

Tänk på en situation, du använder ett Unix-system (macOS, Linux etc) och du har importerat osmodulen. OS-modulen ger ett bärbart sätt att använda operativsystemets funktioner som att läsa eller skriva en fil.

Om du tillåter användare att mata in ett värde med exec(input())kan användaren utfärda kommandon för att ändra fil eller till och med radera alla filer med kommandot os.system('rm -rf *').

Om du använder exec(input())din kod är det en bra idé att kontrollera vilka variabler och metoder användaren kan använda. Du kan se vilka variabler och metoder som är tillgängliga med dir () -metoden.

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

Produktion

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

Begränsa användningen av tillgängliga metoder och variabler i exec ()

Oftare än inte, alla tillgängliga metoder och variabler som används i exec()kanske inte behövs, eller till och med kan ha ett säkerhetshål. Du kan begränsa användningen av dessa variabler och metoder genom att överföra valfria globala och lokala parametrar (ordböcker) till exec()metod.

1. Både globala och lokala parametrar utelämnas

Om båda parametrarna utelämnas (som i våra tidigare exempel) körs koden som förväntas köras av exec()i det aktuella omfånget. Du kan kontrollera tillgängliga variabler och metoder med hjälp av följande kod:

 exec ('print (dir ())')

2. Godkännande globalsparameter; local parameter utelämnas

Globala och lokala parametrar (ordböcker) används för globala respektive lokala variabler. Om lokal ordbok utelämnas är den som standard global ordbok. Det betyder att globaler kommer att användas för både globala och lokala variabler.

Obs: Du kan kontrollera den aktuella globala och lokala ordboken i Python med hjälp av globala () respektive lokalinbyggda () inbyggda metoder.

3. Skicka tom ordbok som globalparameter

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

Om du skickar en tom ordbok som globaler är endast de __builtins__tillgängliga för object(första parametern till exec ()). Även om vi har importerat matematikmodul i ovanstående program kommer ett undantag att försöka komma åt någon av funktionerna i matematikmodulen.

Produktion

 ('__builtins__')

Att göra vissa metoder tillgängliga

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

Här kan koden som körs av exec () också ha sqrt()och pow()metoder tillsammans med __builtins__.

Det är möjligt att ändra namnet på metoden enligt din önskan.

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

I ovanstående program squareRoot()beräknar kvadratroten (liknande funktionalitet som sqrt()). Att försöka använda sqrt()kommer dock att leda till ett undantag.

Begränsa användningen av inbyggda program

Du kan begränsa användningen av __builtins__genom att ge värde Nonetill '__builtins__'i global ordbok.

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

4. Passerar både globala och lokal ordbok

Du kan göra nödvändiga funktioner och variabler tillgängliga för användning genom att skicka lokalbok. Till exempel:

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

Produktion

 ('dir', 'print') 

Här kan endast två inbyggda metoder print () och dir () köras med exec()metod.

Det är viktigt att notera att exec()kör koden och inte returnerar något värde (returnerar None). Därför kan du inte använda retur- och avkastningsuttalanden utanför funktionsdefinitionerna.

Intressanta artiklar...