English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
O método exec() do Python executa programas criados dinamicamente, que podem ser strings ou objetos de código.
Sintaxe do exec();
exec(object, globals, locals)
O exec() usa três parâmetros:
objeto -cadeia de caracteres ou objeto de código
globals (opcional)-dicionário
locals(opcional)-objeto de mapeamento. O dicionário é um tipo de mapeamento padrão comum no Python.
será discutido mais tarde neste artigovariáveis globais(globals) e (locals)localvariáveluso.
O exec() não retorna nenhum valor, ele retorna None.
program = 'a =' 5\nb=10\nprint("Soma =", a)+b)' exec(program)
Quando o programa é executado, a saída é:
Soma = 15
Aqui, o objeto de string program é passado para o exec() que executa o programa. Neste exemplo, os variáveis globais (globals) e (locals)Variáveis locais.
program = input('Programa de entrada:') exec(program)
Quando o programa é executado, a saída é:
Programa de entrada: [print(item) for item in [1, 2, 3]] 1 2 3
Se você precisar obter código Python de um usuário que permite múltiplas linhas de código (usando '\n'), você pode usar o método compile() antes de usar exec().
Saiba mais sobreMétodo compile() no PythonMais informações.
Considere uma situação, você está usando um sistema Unix (macOS, Linux, etc.) e já importou o módulo os. O módulo os fornece métodos portáteis para usar funcionalidades do sistema operacional, por exemplo: ler ou escrever arquivos.
Se o usuário for permitido a usar para inserir valores exec(input()), ele pode emitir comandos para alterar o arquivo, até mesmo usar command para deletar todos os arquivos os.system('rm' -rf *)
Se o exec(input()) for usado no código, é melhor verificar quais variáveis e métodos o usuário pode usar. Você pode usarMétodo dir()Verifique as variáveis e métodos disponíveis.
from math import * exec('print(dir())')
Quando o programa é executado, a saída é:
['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__name__', '_dh', '_i', '_i'1', _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', 'log'1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'quit', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc'
Normalmente, não é necessário usar todos os métodos e variáveis disponíveis no exec(), até mesmo que possam haver vulnerabilidades de segurança. Você pode limitar o uso opcionalglobalselocalsparâmetro (dicionário) passado para o método exec() para limitar o uso dessas variáveis e métodos.
Se ambos os parâmetros forem omitidos (como no exemplo anterior), o código a ser executado pelo exec() será executado no escopo atual. Você pode usar o seguinte código para verificar as variáveis e métodos disponíveis:
exec('print(dir())')
(globals) e (locals)parâmetro(dicionário),usado respectivamente para variáveis globais e locais. Se omitirlocalsdicionário, então o padrão églobalsdicionário. Isso significa que,variáveis globais(globals)será usado para variáveis globais e locais.
Atenção:Você pode usar separadamenteglobals()elocals()métodos integrados no Python verificam o dicionário global e o local atual.
from math import * exec('print(dir())', {}) # Este código causará exceção # exec('print(sqrt('9))', {}
se um dicionário vazio forglobalspassados, apenas __builtins__ está disponível para o object (o primeiro parâmetro do exec()). Mesmo que tenhamos importado o módulo math no programa acima, tentar acessarmódulo mathQualquer função fornecida também causará exceção.
Quando o programa é executado, a saída é:
__builtins__
from math import * exec('print(dir())', {'sqrt': sqrt, 'pow': pow}) # O objeto pode ter o módulo sqrt() exec('print(sqrt('9))', {'sqrt': sqrt, 'pow': pow})
Aqui, o código executado por exec() também pode ter métodos sqrt() e pow() e __builtins__.
O nome do método pode ser alterado conforme sua vontade.
from math import * exec('print(dir())', {'squareRoot': sqrt, 'pow': pow}) # O objeto pode ter o módulo squareRoot() exec('print(squareRoot(9))', {'squareRoot': sqrt, 'pow': pow})
No programa acima, o squareRoot() calcula a raiz quadrada (funções semelhantes, como sqrt()). No entanto, tentar usar sqrt() causará uma exceção.
Você pode limitar o uso de __builtins__ atribuindo None ao __builtins__ no dicionário globals.
exec(object, {'__builtins__': None})
Você pode passarlocalPara fazer com que as funções e variáveis necessárias estejam disponíveis, você pode usar o dicionário
from math import * globalsParameter = {'__builtins__': None} localsParameter = {'print': print, 'dir': dir} exec('print(dir())', globalsParameter, localsParameter)
Quando o programa é executado, a saída é:
['dir', 'print']
Aqui, o método exec() pode executar apenas dois métodos integradosprint()edir().
É necessário prestar atenção especial ao fato de que o exec() executa código e não retorna nenhum valor (retorna None). Portanto, você não pode usar return fora da definição da função eyieldsentença.