English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico do Python

Controle de Fluxo do Python

Função do Python

Tipos de Dados do Python

Operações de Arquivos do Python

Objetos e Classes do Python

Data e Hora do Python

Conhecimento Avançado do Python

Manual de Referência do Python

Uso e exemplo do Python exec()

Funções integradas do Python

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)

Parâmetros do exec()

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.

Retorno do exec()

O exec() não retorna nenhum valor, ele retorna None.

Exemplo1Como o exec() funciona?

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.

Exemplo2: permite que o usuário forneça entrada

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.

Tenha cuidado ao usar exec()

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'

limitar o uso de métodos e variáveis disponíveis no exec()

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.

1. Parâmetros globais(globals) e locais(locals) omitidos

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

passar parâmetro global; omitir parâmetro locals

(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.

passar um dicionário vazio como parâmetro global

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__

fazem alguns métodos disponíveis

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.

Limitar o uso de funções integradas

Você pode limitar o uso de __builtins__ atribuindo None ao __builtins__ no dicionário globals.

exec(object, {'__builtins__': None})

3. Através de dicionários global e local

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.

Funções integradas do Python