Python exec ()

Metoden exec () udfører det dynamisk oprettede program, som enten er en streng eller et kodeobjekt.

Syntaksen for exec():

 exec (objekt, globaler, lokale)

exec () Parametre

exec() tager tre parametre:

  • objekt - Enten en streng eller et kodeobjekt
  • globaler (valgfrit) - en ordbog
  • lokale (valgfrit) - et kortlægningsobjekt. Ordbog er den almindelige og almindeligt anvendte kortlægningstype i Python.

Brug af globaler og lokale diskuteres senere i artiklen.

Returneringsværdi fra exec ()

exec()returnerer ingen værdi, men returnerer None.

Eksempel 1: Hvordan fungerer exec ()?

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

Produktion

 Sum = 15

Her sendes exec()strengobjektprogrammet, som udfører programmet. globale og lokale er udeladt i dette tilfælde.

Eksempel 2: Tillad bruger at levere input

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

Produktion

 Indtast et program: (udskriv (emne) for emne i (1, 2, 3)) 1 2 3

Hvis du vil tage Python-kode fra brugeren, som tillader multiline-kode (ved hjælp af ''), kan du bruge compile()metoden, før du bruger exec().

Lær mere om compile () -metoden i Python.

Vær forsigtig, når du bruger exec ()

Overvej en situation, du bruger et Unix-system (macOS, Linux osv.), Og du har importeret osmodul. OS-modulet giver en bærbar måde at bruge operativsystemfunktioner som at læse eller skrive en fil.

Hvis du tillader brugere at indtaste en værdi ved hjælp af exec(input()), kan brugeren muligvis udstede kommandoer for at ændre fil eller endda slette alle filerne ved hjælp af kommandoen os.system('rm -rf *').

Hvis du bruger exec(input())din kode, er det en god ide at kontrollere, hvilke variabler og metoder brugeren kan bruge. Du kan se, hvilke variabler og metoder der er tilgængelige ved hjælp af 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', ' gulv ',' 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ænsning af brugen af ​​tilgængelige metoder og variabler i exec ()

Oftere end ikke, er alle de tilgængelige metoder og variabler, der bruges i, exec()muligvis ikke nødvendige, eller endda et sikkerhedshul. Du kan begrænse brugen af ​​disse variabler og metoder ved at overføre valgfri globaler og lokale parametre (ordbøger) til exec()metode.

1. Både globale og lokale parametre er udeladt

Hvis begge parametre er udeladt (som i vores tidligere eksempler), udføres den kode, der forventes udført af, exec()i det aktuelle omfang. Du kan kontrollere de tilgængelige variabler og metoder ved hjælp af følgende kode:

 exec ('print (dir ())')

2. Passerende globalsparameter; lokale parameter er udeladt

Globale og lokale parametre (ordbøger) bruges til henholdsvis globale og lokale variabler. Hvis lokal ordbog er udeladt, er den som standard global ordbog. Betydning, globaler vil blive brugt til både globale og lokale variabler.

Bemærk: Du kan kontrollere den aktuelle globale og lokale ordbog i Python ved hjælp af henholdsvis globals () og locals () indbyggede metoder.

3. At sende tom ordbog som globalparameter

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

Hvis du sender en tom ordbog som globaler, er kun de __builtins__tilgængelige for object(første parameter til exec ()). Selvom vi har importeret matematikmodul i ovenstående program, vil forsøg på at få adgang til nogen af ​​funktionerne i matematikmodulet medføre en undtagelse.

Produktion

 ('__builtins__')

Gør visse metoder tilgængelige

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

Her kan koden, der udføres af exec (), også have sqrt()og pow()metoder sammen med __builtins__.

Det er muligt at ændre navnet på metoden efter dit ønske.

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

I ovenstående program squareRoot()beregner kvadratroden (lignende funktionalitet som sqrt()). Forsøg på at bruge sqrt()vil dog medføre en undtagelse.

Begrænsning af brugen af ​​indbyggede

Du kan begrænse brugen af __builtins__ved at give værdi Nonetil '__builtins__'i global ordbogen.

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

4. Passerer både global og lokal ordbog

Du kan stille nødvendige funktioner og variabler til rådighed til brug ved at passere lokalordbogen. For eksempel:

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

Produktion

 ('dir', 'print') 

Her kan kun to indbyggede metoder print () og dir () udføres efter exec()metode.

Det er vigtigt at bemærke, at den exec()udfører koden og ikke returnerer nogen værdi (returnerer None). Derfor kan du ikke bruge retur- og afkastudtalelser uden for funktionsdefinitionerne.

Interessante artikler...