Рубрики
Без рубрики

Python Exec ()

Пример python exec (), python exec (), python exec () vs eval, python exec vis vis eval, python exect value value, аргументы python exec globals, locals, __builtins__.

Автор оригинала: Pankaj Kumar.

Функция Python Exec () обеспечивает поддержку выполнения динамического кода.

Python Exec ()

Подпись функции Python Exec ():

exec(object, globals, locals)

объект – Это должно быть либо строка, либо объект кода. Если это строка, то он анализируется как блок Python заявления а затем выполнить его.

глобал – Используется для уточнения глобальных функций, доступных для выполнения функции EXEC (). Это должен быть словар. Если __Builtins__ не определен, то все встроенные функции доступны для функции exec.

Местные жители – Используется для указания локальных функций и доступных переменных. Это может быть любой объект отображения. Однако словарь предпочтительно для сходства с переменной глобалей.

Функция Python Exec () не возвращает ничего. Таким образом, он не может быть использован с возвратами и выходами.

Python exec () vs eval ()

Функции Python EXEC () и EVAL () очень похожи. Их использование и поддержка динамического выполнения кода также очень похоже.

Однако существует одна серьезная разница между функциями EXEC () и EVEL (). Функция Python EXEC () не возвращает ничего, что EVAL () функция EVAL () оценивает выражение и возвращает значение к вызовамую коду.

Пример Python Exec ()

Давайте посмотрим на простой пример функции Python EXEC ().

x = 1

exec('print(x==1)')

exec('print(x+2)') 

Выход:

True
3

Python EXEC () Динамическое выполнение кода

Давайте посмотрим на другой пример, где пользователь войдет в код, который будет выполнен нашей программой.

from math import *

for l in range(1, 3):

    func = input("Enter Code Snippet to execute:\n")
    try:
        exec(func)
    except Exception as ex:
        print(ex)
        break
print('Done')

Пример вывода:

Enter Code Snippet to execute:
print(sqrt(16))
4.0
Enter Code Snippet to execute:
print(min(2,1))
1
Done

Обратите внимание, что я использую SQRT () из математического модуля, печать () и мин () встроены функции.

Python Exec () Риски безопасности

Поскольку мы можем выполнить любой код, существуют риски безопасности, связанные с функцией EXEC (). Что если кто-то импортирует модуль ОС и выпуск OS.System ('RM -RF/') команда. Это побивает нашу систему, потому что все файлы будут удалены. Это когда глобальные параметры и параметры местных жителей пригодны, чтобы иметь ограниченный доступ.

Python Exec () глобал и местные жители

Прежде чем мы определимся с функциями, которые должны быть доступны для Exec (), это хорошая идея получить список доступных функций и модулей, используя dir () функция.

from math import *

def square_root(n):
   return sqrt(n)

exec('print(dir())') # list of names in the current local scope

Выход:

['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'square_root', 'tan', 'tanh', 'tau', 'trunc']

Это много функций, начиная от встроенного модуля, математического модуля и нашей определенной функции Square_root.

Давайте посмотрим, что произойдет, если мы предоставляем глобальные значения как пустой словарь.

exec('print(dir())',{})

Выход:

['__builtins__']

Таким образом, встроенные функции доступны, если глобали не имеют ключа для него. Давайте посмотрим, как указать доступ только к нескольким функциям из встроенного модуля.

exec('print(min(1,2))',{"__builtins__":{"min": min, "print": print}}) #1

Давайте посмотрим на другой пример, где мы определим как глобал, так и местные значения параметров.

y=5
exec('print(y+1)',{"__builtins__": None}, {"y": y, "print": print}) # 6

Давайте посмотрим на заключительный пример, где мы предоставим доступ только к нескольким функциям математических модулей.

from math import *

for l in range(1, 3):
    func = input("Enter Code Snippet with Math Function to execute.\nFor Examples; print(squareRoot(x)) and print(pow(x,y)):\n")
    try:
        exec(func, {"squareRoot": sqrt, "pow": pow})
    except Exception as ex:
        print(ex)
        break
print('Done')

Выход пример:

Enter Code Snippet with Math Function to execute.
For Examples; print(squareRoot(x)) and print(pow(x,y)):
print(squareRoot(100))
10.0
Enter Code Snippet with Math Function to execute.
For Examples; print(squareRoot(x)) and print(pow(x,y)):
print(max(2,4))
4
Done

Мы можем указать пользовательское имя для карты с любой функцией, подобной, как мы определили Squareroot, чтобы быть сопоставленным с функцией SQRT.

Обратите внимание, что встроенные функции доступны, потому что я не проверял их явно. Так что лучший способ определить EXEC ():

exec(func, {"squareRoot": sqrt, "pow": pow, "__builtins__": None, "print": print})

Выходной вывод будет:

Enter Code Snippet with Math Function to execute.
For Examples; print(squareRoot(x)) and print(pow(x,y)):
print(squareRoot(100))
10.0
Enter Code Snippet with Math Function to execute.
For Examples; print(squareRoot(x)) and print(pow(x,y)):
print(max(2,4))
'NoneType' object is not subscriptable
Done

Теперь ошибка приходит, потому что Max () функция не доступна для функции exec ().

Резюме

Так же, как eval (), функция python exec () очень мощная. Вы не должны позволять выполнить нерешительный код, используемый с помощью EXEC (), так как он действительно может причинить вред вашей системе.

Ссылка: API док