Exec python 3 примеры

Функция exec() в Python

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

exec(object, globals, locals)

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

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

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

Функция exec() возвращает None. Поэтому его нельзя использовать с операторами return и yield.

Сравнение exec() и eval()

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

Однако есть одно важное различие между функциями exec() и eval(). Функция exec() ничего не возвращает, тогда как функция eval() оценивает выражение и возвращает значение в вызывающий код.

Пример

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

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

Выполнение динамического кода

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

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

Функция exec в python

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

Угрозы безопасности

Поскольку мы можем выполнять любой код, существуют риски безопасности, связанные с функцией exec(). Что, если кто-то импортирует модуль os и выполнит команду os.system (‘rm -rf /’). Это приведет к сбою нашей системы, потому что все файлы будут удалены. Это когда параметры globals и locals пригодятся для ограничения доступа.

Глобальные и локальные переменные

Прежде чем мы определимся с функциями, которые должны быть доступны для 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.

Читайте также:  Jquery создать html элементы

Посмотрим, что произойдет, если мы предоставим значение globals как пустой словарь.

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

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

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

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, ) 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():

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

Метод exec в python

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

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

Источник

Метод exec() в Python

По сути, метод Python exec() выполняет переданный набор кода в виде строки. Это очень полезно, так как практически поддерживает динамическое выполнение. Синтаксис метода приведен ниже.

exec(object, globals, locals)

Здесь object может быть строкой, объектом открытого файла или объектом кода.

  • Для строки — строка анализируется как набор операторов Python, который затем выполняется (если не возникает синтаксическая ошибка).
  • Для открытого файла — файл анализируется до EOF и выполняется.
  • Для объекта кода — просто выполняется.

И два дополнительных аргументов globals и locals должны быть словари , используемые для глобальных и локальных переменных.

Exec() метод

Давайте попробуем понять, как он работает, на примере.

>>> exec("print('Hey!')") Hey! >>> exec("print(6+4)") 10

Из приведенного выше фрагмента кода ясно, что операторы print() успешно выполняются методом exec() и мы получаем желаемые результаты.

Работа с методом Python exec()

Теперь давайте сразу перейдем к некоторым примерам, изучающим, как метод exec() работает в Python с параметрами globals и locals и без них.

1 Без глобальных и локальных параметров

В предыдущем примере мы просто выполнили некоторый набор инструкций в Python, передав аргумент объекта методу exec() . Но мы не видели имена в текущей области.

Читайте также:  Что такое framework javascript

Теперь давайте воспользуемся методом dir(), чтобы получить список текущих методов и имен с включенным math модулем перед вызовом метода exec() .

from math import * exec("print(pow(2, 5))") exec("print(dir())")
32.0 ['__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', 'tan', 'tanh', 'tau', 'trunc']

Как видите, различные методы, включая builtins , а также из math модуля, прямо сейчас находятся в текущей области видимости и доступны для метода exec() .

Это создает большую проблему безопасности, когда вы думаете о выполнении динамического кода Python. Пользователь может включать некоторые модули для доступа к системным командам, которые даже могут привести к сбою вашего компьютера.

Используя параметры globals и locals мы можем буквально ограничить exec() чтобы выйти за пределы методов, к которым мы хотим получить доступ.

2 С параметром globals

Python позволяет нам передавать и указывать только те методы, к которым мы хотим, чтобы метод exec() имел доступ (в форме словаря) из встроенного модуля.

def squareNo(a): return a*a exec('print(squareit(10))',>) exec("print(dir())")
100 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'squareNo']

В приведенном выше коде мы передали словарь, содержащий методы squareNo() (сопоставленные с настраиваемым именем squareit) и print() .

Обратите внимание: использование любого другого метода из встроенного метода вызовет TypeError .

3 С параметром locals

Когда мы передаем только local параметр (словарь), по умолчанию все встроенные методы также становятся доступными до тех пор, пока мы явно не исключим их.

Посмотрите на пример ниже, хотя мы указали словарь locals все встроенные и математические методы модуля доступны в текущей области.

from math import * def squareNo(a): return a*a #global And local parameters exec('print(pow(4,3))', ) exec("print(dir())")
64 ['__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', 'squareNo', 'tan', 'tanh', 'tau', 'trunc']

Следовательно, теперь явно исключая встроенные функции.

from math import * def squareNo(a): return a*a #explicitly excluding built-ins exec('print(pow(4,3))', ,) exec("print(dir())")
Traceback (most recent call last): File "C:/Users/sneha/Desktop/test.py", line 7, in exec('print(pow(4,3))', ,) File "", line 1, in TypeError: 'NoneType' object is not subscriptable

В приведенном выше коде ограничение метода на использование только переданных (локальных) методов практически делает недоступным метод pow() . Следовательно, при его запуске мы получаем TypeError .

Читайте также:  Python время выполнения ячейки

exec() сравнение с eval()

Между методами eval() и exec() есть два основных различия, хотя они выполняют почти одинаковую работу.

  1. eval() может выполнять только одно выражение, тогда как exec() может использоваться для выполнения динамически созданного оператора или программы, которая может включать циклы, операторы if-else , определения функций и class ,
  2. eval() возвращает значение после выполнения определенного выражения, тогда как exec() в основном ничего не возвращает и просто игнорирует значение.

Источник

Функция exec() в Python и примеры

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

Что такое exec() в Python?

Метод exec() в Python выполняет динамически созданную программу, которая является либо строкой, либо объектом кода. Если это объектный код, он просто выполняется, но если это строка, то она анализируется как набор операторов Python, который затем выполняется; в противном случае возникает синтаксическая ошибка.

Пример функции exec() в Python

Синтаксис

  • object: Здесь объект является либо строкой, либо объектом кода.
  • globals: это может быть словарь, и этот параметр является необязательным.
  • locals: это может быть объект сопоставления, и это необязательное поле.

Функция exec() Python ничего не возвращает.

Как работает exec() на примере

Рассмотрим выполнение функции exec() в Python на примере.

Здесь строковый объект prog передается в exec(), и он выполняется.

Передача глобального и локального словаря

Здесь, в этом примере, мы видим, что мы передаем пустой словарь в качестве параметра функции exec(), и отображается только __builtin__ , а никакие другие математические функции не отображаются. Глобальный параметр опережает локальный параметр, поскольку он пуст.

Но мы можем передавать глобальные и локальные параметры вместе в простом операторе. Давайте посмотрим на пример ниже.

Итак, мы видим, что, используя локальные параметры, мы можем реализовать нашу функцию в соответствии с нашими потребностями. Здесь print, sum — напечатаны.

Кроме того, мы можем ограничить использование метода __builtin__ следующим образом.

Итак, здесь мы видим, что отображаются только dir, print и sum.

Предостережения при использовании exec()

Рассмотрим ситуацию: вы используете систему Unix (macOS, Linux и т. д.) и импортировали модуль os.

Модуль os предоставляет портативный способ использования функций операционной системы, таких как чтение или запись файла. Если вы разрешите пользователям вводить значение с помощью exec(input()), пользователь может давать команды для изменения файлов или даже удалять все файлы с помощью этой команды.

Если вы используете exec(input()) в своем коде, рекомендуется проверить, какие переменные и методы могут использовать пользователи. Вы можете увидеть, какие переменные и методы доступны, используя метод dir().

Чаще всего все доступные методы и переменные, используемые в exec(), могут быть не нужны или даже могут иметь дыру в безопасности. Вы можете ограничить использование этих переменных и методов, минуя необязательные глобальные и локальные параметры(словари) для метода exec().

Выполнение динамического кода Python exec()

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

Источник

Оцените статью