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