English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Il metodo exec() di Python esegue programmi creati dinamicamente, che possono essere stringhe o oggetti codice.
Sintassi di exec()
exec(object, globals, locals)
exec() accetta tre parametri:
Oggetto - Stringa o oggetto codice
globals Opzionale) - Dizionario
localsOpzionale) - Oggetto mappatura. La mappa è un tipo di mappatura standard utilizzato frequentemente in Python.
Verranno discussi in questo articolo.Variabili globali(globals) e (locals)LocaleVariabileUso.
exec() non restituisce alcun valore, restituisce None.
program = 'a = 5\nb=10\nprint("Somma =", a+b)' exec(program)
Quando si esegue il programma, l'output è:
Somma = 15
Qui, l'oggetto stringa program viene passato a exec() per eseguire il programma. In questo esempio sono stati omessi i variabili globali(globals) e (locals)Variabile locale.
program = input('Inserisci il programma:') exec(program)
Quando si esegue il programma, l'output è:
Programma di input: [print(item) for item in [1, 2, 3]] 1 2 3
Se devi ottenere codice Python da un utente che può inserire codice a multilinea (usando '\n'), puoi utilizzare il metodo compile() prima di exec().
Conosci qualcosa suMetodo compile() in PythonPiù informazioni.
Considera un caso in cui stai utilizzando un sistema Unix (macOS, Linux, ecc.) e hai importato il modulo os. Il modulo os fornisce un metodo portatile per utilizzare le funzionalità del sistema operativo, ad esempio: leggere o scrivere file.
Se si permette all'utente di utilizzare exec(input()) per inserire valori, l'utente può emettere comandi per modificare i file, persino utilizzare command per eliminare tutti i file os.system('rm -rf *').
Se si utilizza exec(input()) nel codice, è meglio controllare quali variabili e metodi possono essere utilizzati dall'utente. Puoi usareMetodo dir()Visualizza le variabili e i metodi disponibili.
from math import * exec('print(dir())')
Quando si esegue il programma, l'output è:
['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', 'floor', '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']
Di solito, non è necessario utilizzare tutti i metodi e le variabili disponibili in exec(), potrebbe anche esserci una falla di sicurezza. Puoi limitare l'uso opzionaleglobalselocalsparametro (dizionario) viene passato al metodo exec() per limitare l'uso di queste variabili e metodi.
Se entrambi i parametri vengono omessi (come nel nostro esempio precedente), exec() si aspetta di eseguire il codice nella portata corrente. Puoi usare il seguente codice per controllare le variabili e i metodi disponibili:
exec('print(dir())')
(globals) e (locals)parametro(dizionario), rispettivamente per variabili globali e locali. Se si omettelocalsIl dizionario, se non specificato, di default èglobalsQuesto significa cheVariabili globali (globals)verranno utilizzati per variabili globali e locali.
Attenzione:Puoi usarli rispettivamenteglobals()elocals()I metodi built-in in Python controllano il dizionario globale e il dizionario locale corrente.
from math import * exec('print(dir())', {}) # Questo codice genererà un'eccezione # exec('print(sqrt(9))', {})
Se si passa un dizionario vuoto comeglobalsSe non viene trasmesso, è disponibile solo __builtins__ per l'oggetto (il primo argomento di exec()). Anche se abbiamo importato il modulo math nel programma sopra, cercare di accederemodulo mathOgni funzione fornita può causare un'eccezione.
Quando si esegue il programma, l'output è:
['__builtins__']
from math import * exec('print(dir())', {'sqrt': sqrt, 'pow': pow}) # L'oggetto può avere il modulo sqrt() exec('print(sqrt(9))', {'sqrt': sqrt, 'pow': pow})
Qui, il codice eseguito da exec() può avere anche i metodi sqrt() e pow() e __builtins__.
Puoi modificare il nome del metodo a tuo piacimento.
from math import * exec('print(dir())', {'squareRoot': sqrt, 'pow': pow}) # L'oggetto può avere il modulo squareRoot() exec('print(squareRoot(9))', {'squareRoot': sqrt, 'pow': pow})
Nel programma sopra, la funzione squareRoot() calcola la radice quadrata (funzioni simili come sqrt()). Ma l'uso di sqrt() provocherà un'eccezione.
Puoi limitare l'uso di __builtins__ assegnando None al dizionario globals per __builtins__.
exec(object, {'__builtins__': None})
Puoi passareLocaleUtilizzando il dizionario (locals) per rendere disponibili le funzioni e le variabili necessarie. Ad esempio:
from math import * globalsParameter = {'__builtins__': None} localsParameter = {'print': print, 'dir': dir} exec('print(dir())', globalsParameter, localsParameter)
Quando si esegue il programma, l'output è:
['dir', 'print']
In questo caso, il metodo exec() può eseguire solo due metodi nativiprint()edir().
Occorre prestare particolare attenzione perché exec() esegue codice e non restituisce alcun valore (restituisce None). Pertanto, non è possibile utilizzare return al di fuori della definizione della funzione eyieldenunciato.