Python exec ()

Metoden exec () kjører det dynamisk opprettede programmet, som enten er en streng eller et kodeobjekt.

Syntaksen til exec():

 exec (objekt, globaler, lokalbefolkningen)

exec () Parametere

exec() tar tre parametere:

  • objekt - Enten en streng eller et kodeobjekt
  • globaler (valgfritt) - en ordbok
  • lokale (valgfritt) - et kartleggingsobjekt. Ordbok er standard og ofte brukt kartleggingstype i Python.

Bruk av globaler og lokalbefolkningen vil bli diskutert senere i artikkelen.

Returverdi fra exec ()

exec()returnerer ingen verdi, men returnerer None.

Eksempel 1: Hvordan fungerer exec ()?

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

Produksjon

 Sum = 15

Her sendes exec()strengobjektprogrammet som kjører programmet. globale og lokale er utelatt i dette tilfellet.

Eksempel 2: La brukeren komme med innspill

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

Produksjon

 Angi et program: (skriv ut (element) for element i (1, 2, 3)) 1 2 3

Hvis du vil ta Python-kode fra brukeren som tillater flerlinjekode (ved hjelp av ''), kan du bruke compile()metoden før du bruker exec().

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

Vær forsiktig når du bruker exec ()

Tenk på en situasjon, du bruker et Unix-system (macOS, Linux osv.) Og du har importert osmodul. OS-modulen gir en bærbar måte å bruke operativsystemfunksjoner som å lese eller skrive en fil.

Hvis du tillater brukere å legge inn en verdi ved hjelp exec(input()), kan brukeren gi kommandoer for å endre fil eller til og med slette alle filene ved hjelp av kommandoen os.system('rm -rf *').

Hvis du bruker exec(input())koden din, er det lurt å sjekke hvilke variabler og metoder brukeren kan bruke. Du kan se hvilke variabler og metoder som er tilgjengelige ved hjelp av dir () -metoden.

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

Produksjon

('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', 'degrees', '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')

Begrensning av bruken av tilgjengelige metoder og variabler i exec ()

Oftere enn ikke, alle tilgjengelige metoder og variabler som brukes i, er exec()kanskje ikke nødvendig, eller til og med et sikkerhetshull. Du kan begrense bruken av disse variablene og metodene ved å overføre valgfrie globaler og lokale parametere (ordbøker) til exec()metoden.

1. Både globale og lokale parametere er utelatt

Hvis begge parametrene er utelatt (som i våre tidligere eksempler), blir koden som forventes utført av exec()utført i gjeldende omfang. Du kan sjekke tilgjengelige variabler og metoder ved hjelp av følgende kode:

 exec ('print (dir ())')

2. Passing globals parameter; lokale parameter er utelatt

Globale og lokale parametere (ordbøker) brukes til henholdsvis globale og lokale variabler. Hvis lokal ordbok er utelatt, er den som standard global ordbok. Betydning, globaler vil bli brukt for både globale og lokale variabler.

Merk: Du kan sjekke den nåværende globale og lokale ordboken i Python ved å bruke henholdsvis globals () og lokale () innebygde metoder.

3. Passer tom ordbok som globalparameter

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

Hvis du sender en tom ordbok som globaler, er bare de __builtins__tilgjengelige for object(første parameter til exec ()). Selv om vi har importert matematikkmodul i programmet ovenfor, vil det prøve å få tilgang til noen av funksjonene som tilbys av matematikkmodulen, et unntak.

Produksjon

 ('__builtins__')

Gjøre visse metoder tilgjengelige

 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 som kjøres av exec () også ha sqrt()og pow()metoder sammen med __builtins__.

Det er mulig å endre navnet på metoden i henhold til ditt ø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 programmet ovenfor squareRoot()beregner du kvadratroten (lignende funksjonalitet som sqrt()). Å prøve å bruke sqrt()vil imidlertid heve et unntak.

Begrensning av bruken av innebygde moduler

Du kan begrense bruken av __builtins__ved å gi verdi Nonetil '__builtins__'i global ordbok.

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

4. Passerer både global og lokal ordbok

Du kan gjøre nødvendige funksjoner og variabler tilgjengelige for bruk ved å passere lokal ordbok. For eksempel:

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

Produksjon

 ('dir', 'print') 

Her kan bare to innebygde metoder print () og dir () utføres etter exec()metode.

Det er viktig å merke seg at, exec()kjører koden og ikke returnerer noen verdi (returnerer None). Derfor kan du ikke bruke retur- og avkastningsuttalelser utenfor funksjonsdefinisjonene.

Interessante artikler...