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

Синтаксис
|
1 |
exec(object, globals, locals) |
- object: Здесь объект является либо строкой, либо объектом кода.
- globals: это может быть словарь, и этот параметр является необязательным.
- locals: это может быть объект сопоставления, и это необязательное поле.
Функция exec() Python ничего не возвращает.
Как работает exec() на примере
Рассмотрим выполнение функции exec() в Python на примере.
См. следующий код.
|
1 2 3 4 5 |
# Program to display working of exec() prog = "a=10 \nb=5 \nprint('Sum of two is: ',a+b)" # calling exec() exec(prog) |
Выход:
|
1 2 3 |
➜ pyt python3 app.py Sum of two is: 15 ➜ pyt |
Здесь строковый объект prog передается в exec(), и он выполняется.
Передача глобального и локального словаря
См. следующий код.
|
1 2 3 4 5 6 |
# app.py # Passing global variable only from math import * # Only the global variable is passed exec("print(dir())", {}) |
Выход:
|
1 2 3 |
➜ pyt python3 app.py ['__builtins__'] ➜ pyt |
Здесь, в этом примере, мы видим, что мы передаем пустой словарь в качестве параметра функции exec(), и отображается только __builtin__ , а никакие другие математические функции не отображаются. Глобальный параметр опережает локальный параметр, поскольку он пуст.
Но мы можем передавать глобальные и локальные параметры вместе в простом операторе. Давайте посмотрим на пример ниже.
|
1 2 3 4 5 6 |
# app.py # Passing global and local variable variable from math import * # Only the global and local both are passed exec("print(dir())", {'print': print, 'sum': sum}) |
Выход:
|
1 2 3 |
➜ pyt python3 app.py ['__builtins__', 'print', 'sum'] ➜ pyt |
Итак, мы видим, что, используя локальные параметры, мы можем реализовать нашу функцию в соответствии с нашими потребностями. Здесь print, sum — напечатаны.
Кроме того, мы можем ограничить использование метода __builtin__ следующим образом.
|
1 2 3 4 5 6 7 |
# app.py # Restricting gobal variable from math import * # we are giving restrictio to __builtin__ exec("print(dir())", {"__builtins__": None}, { "sum": sum, "print": print, "dir": dir}) |
Выход:
|
1 2 3 |
➜ pyt python3 app.py ['dir', 'print', 'sum'] ➜ pyt |
Итак, здесь мы видим, что отображаются только dir, print и sum.
Предостережения при использовании exec()
Рассмотрим ситуацию: вы используете систему Unix (macOS, Linux и т. д.) и импортировали модуль os.
Модуль os предоставляет портативный способ использования функций операционной системы, таких как чтение или запись файла. Если вы разрешите пользователям вводить значение с помощью exec(input()), пользователь может давать команды для изменения файлов или даже удалять все файлы с помощью этой команды.
|
1 |
os.system('rm -rf *') |
Если вы используете exec(input()) в своем коде, рекомендуется проверить, какие переменные и методы могут использовать пользователи. Вы можете увидеть, какие переменные и методы доступны, используя метод dir().
Чаще всего все доступные методы и переменные, используемые в exec(), могут быть не нужны или даже могут иметь дыру в безопасности. Вы можете ограничить использование этих переменных и методов, минуя необязательные глобальные и локальные параметры(словари) для метода exec().
Выполнение динамического кода Python exec()
Давайте посмотрим на другой пример, где пользователь вводит код, который будет выполняться нашей программой.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# app.py from math import * for l in range(1, 4): func = input("Enter Code to execute:\n") try: exec(func) except Exception as ex: print(ex) break print('Home Run') |
Выход:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
➜ pyt python3 app.py Enter Code to execute: print(sqrt(81)) 9.0 Enter Code to execute: print(max(19,21)) 21 Enter Code to execute: print(min(11,21)) 11 Home Run ➜ pyt |
