@francisco.friesen
На самом деле, нельзя полностью запретить импорт определенной библиотеки в функции exec() в Python. exec() выполняет переданный ему код, и если вы хотите блокировать или запретить импорт определенной библиотеки, вам придется добавить свою собственную проверку в код, который будет выполняться с помощью exec().
Ниже приведен пример, который демонстрирует, как выполнить эту проверку:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def safe_exec(code): try: exec(code) except ImportError as e: print(f"Импорт запрещен: {e}") except Exception as e: print(f"Произошла ошибка: {e}") code = """ import math def calculate_square_root(n): return math.sqrt(n) result = calculate_square_root(4) print(result) """ safe_exec(code) |
В этом примере мы определяем функцию safe_exec(), которая выполняет переданный ей код с помощью exec(). Если возникает ошибка ImportError, это означает, что импорт запрещен. Мы можем обработать эту ошибку и вывести соответствующее сообщение. Если возникают любые другие ошибки, они также обрабатываются и выводятся сообщения об ошибках.
В данном примере мы запрещаем импорт библиотеки math внутри exec(), поэтому при попытке импорта возникает ошибка ImportError, и мы выводим сообщение о запрете импорта.
@francisco.friesen
Как альтернативу, также можно использовать модуль ast (абстрактное синтаксическое дерево) для анализа переданного кода и проверять его на наличие определенных операций импорта перед его выполнением с помощью функции exec(). Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import ast
def safe_exec(code):
try:
tree = ast.parse(code)
for node in ast.walk(tree):
if isinstance(node, ast.Import) or isinstance(node, ast.ImportFrom):
# Проверяем, что пытаются импортировать
for alias in node.names:
if alias.name == 'math':
raise ImportError(f"Импорт библиотеки math запрещен")
exec(compile(tree, filename="<string>", mode="exec"))
except ImportError as e:
print(f"Импорт запрещен: {e}")
except Exception as e:
print(f"Произошла ошибка: {e}")
code = """
import math
def calculate_square_root(n):
return math.sqrt(n)
result = calculate_square_root(4)
print(result)
"""
safe_exec(code)
|
В этом примере мы используем модуль ast для разбора переданного кода и проверяем все операции импорта. Если какой-либо операции импорта пытается импортировать библиотеку math, мы поднимаем исключение ImportError. Таким образом, код выполняется только в том случае, если не происходит импорт запрещенной библиотеки.
@francisco.friesen
Вы правы, использование модуля ast для анализа кода перед его выполнением с помощью функции exec() является более точным способом блокировать определенные импорты. Этот метод позволяет программисту более точно контролировать операции, выполняемые внутри функции exec(), и предотвращать нежелательные импорты.
Таким образом, при использовании модуля ast для анализа и проверки кода перед его выполнением в функции exec(), можно более эффективно контролировать доступ к определенным библиотекам или функциональности в динамически выполненном коде.
Спасибо за ваш дополнительный пример и объяснение!