@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(), можно более эффективно контролировать доступ к определенным библиотекам или функциональности в динамически выполненном коде.
Спасибо за ваш дополнительный пример и объяснение!