Функція exec() виконує динамічно створену програму, яка є рядком або об’єктом коду. Наприклад:
|
1 2 |
program = 'a = 5\nb=10\nprint("Sum =", a+b)' exec(program) |
Результат:
Sum = 15
Синтаксис функції exec()
|
1 |
exec(object, globals, locals) |
Параметри функції exec()
Функція exec() приймає три параметри:
object — рядок або об’єкт коду;
globals (не обов’язково) — словник;
locals (не обов’язково) — об’єкт для зіставлення (зазвичай словник).
Значення, яке повертає функція exec()
Функція exec() не повертає жодного значення.
Приклад №1: Функція exec() в Python
|
1 2 |
program = 'a = 5\nb=10\nprint("Sum =", a+b)' exec(program) |
Результат:
Sum = 15
В даному прикладі ми передали рядковий об’єкт program у функцію exec(). Функція виконує Python-код всередині об’єкта та виводить Sum = 15.
Приклад №2: Функція exec() з однорядковим програмним вводом
|
1 2 3 4 5 |
# Отримуємо всю програму в якості вхідних даних program = input('Enter a program:') # Виконуємо програму exec(program) |
Результат:
Enter a program: [print(item) for item in [1, 2, 3]]
1
2
3
У даному прикладі ми використали наступне в якості вхідного значення:
|
1 |
print(item) for item in [1, 2, 3] |
Функція exec() виконує об’єкт program, який має введений користувачем код.
Примітка: При використанні функції exec() з модулем os потрібно бути обережним. Це пов’язано з тим, що можна випадково змінити або видалити файли під час використання коду os.system('rm -rf *') у вхідних даних.
Приклад №3: Перевірка доступного коду за допомогою функції exec()
Рекомендується перевіряти функції та змінні, які потрібно використовувати з функцією exec(). Це можна зробити за допомогою функції dir():
|
1 2 3 4 5 |
# Імпортуємо всі функції з бібліотеки math from math import * # Перевіряємо доступні функції exec('print(dir())') |
Результат:
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'cbrt', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'exp2', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']
Приклад №4: Блокування непотрібних функцій та змінних у функції exec()
У більшості випадків нам не потрібні всі функції та змінні функції exec(). Ми можемо заблокувати ці непотрібні функції та змінні, передавши необов’язкові параметри globals та locals у функцію exec():
|
1 2 3 4 5 6 7 8 9 |
# Імпортуємо функції з бібліотеки math from math import * # Використовуємо функцію cbrt() mycode='''a = cbrt(9) print(a)''' # Порожній словник (параметр globals) для обмеження функції cbrt() exec(mycode, {}) |
Результат:
NameError: name 'cbrt' is not defined
Тут ми обмежили використання функції cbrt() в exec(), хоча імпортували всю бібліотеку math. Ось чому ми отримали помилку.
Приклад №5: Використання необхідних функцій та змінних у функції exec()
Ми також можемо зробити необхідні функції та змінні доступними для використання з функцією exec(). Для цього нам потрібно передати словник locals у функцію exec():
|
1 2 3 4 5 6 7 8 9 10 |
from math import * # Встановлюємо параметру globals значення None globalsParameter = {'__builtins__' : None} # Встановлюємо параметр locals, щоб він приймав лише функції print() та dir() localsParameter = {'print': print, 'dir': dir} # Виводимо список доступних функцій exec('print(dir())', globalsParameter, localsParameter) |
Результат:
['dir', 'print']
Ми заблокували всі глобальні вбудовані функції за допомогою наступного рядка коду:
|
1 |
globalsParameter = {'__builtins__' : None} |
Але дозволили виконання двох функцій: print() та dir(), разом із кодом:
|
1 |
localsParameter = {'print': print, 'dir': dir} |
Нарешті, ми передали функцію dir() усередину функції print(), а потім передали все у функцію exec() для виведення списку доступних функцій.
Тут globalsParameter та localsParameter є необов’язковими параметрами, які ми використали з функцією exec() для виводу лише тих функцій, до яких хочемо отримати доступ.

(5 оцінок, середня: 4,60 з 5)