Как запретить импорт определённого модуля в python-скрипте?

Ссылка скопирована
20 января 2026 1 ответ

Пример:

Если в любом месте кода написать `import uuid` или `from uuid import <...>`, скрипт не запустится.
При этом библиотеки могут использовать `import uuid` свободно.

Существует ли способ такое сделать?

Дополнительно:

а зачем???

  • Saboteur, в нашем сервисе используется библиотека fastuuid вместо uuid,
    и я целый день потратил на поиск ошибки, когда у меня два set() с ууидами не пересекаются, хотя и должны.
    В итоге выяснилось, что в одном множестве лежат uuid.UUID, а в другом fastuuid.UUID,
    поэтому эти множества никогда не пересекутся.
    Мы подумали, а нельзя ли как-то запретить импорт uuid, раз уж нужно использовать fastuuid, потому что по-любому, кто-нибудь в следующий раз про это забудет и снова потратит кучу времени.

    При этом некоторые пакеты в requirements.txt используют uuid, это ок.

    Пробовал разобраться, можно ли как-то приспособить под это ast, но так и недоразобрался.

  • Alexey Al, ну так эту проблему надо было сразу и озвучить в вопросе, а решается она не запретами, а созданием абстракции, которая и будет выдать "правильные" UUID, причем даже лучше чтобы ее вызов был автоматический, а не явный ручной.
  • Ответы:

    import sys import uuid module_name = "uuid" if sys.modules.get(module_name):     raise ImportError(f"Запрет на модуль {module_name}")

    import sys import uuid module_name = "uuid" if sys.modules.get(module_name): raise ImportError(f"Запрет на модуль {module_name}")

    В ответе: ImportError: Запрет на модуль uuid

    Как ты отличишь импорт из скрипта от импорта из библиотеки?
    Можно отреагировать на импорт в момент, когда он происходит - но понять, кто его выполнил, тяжело.
    И даже если ты сумеешь через анализ текущего фрейма стека понять, кто вызвал импорт - импортированный модуль будет закэширован, и скрипт потом сможет обратиться к нему через sys.modules. Так что либо запрещать импорт модуля в принципе (например, через аудит хук), либо разрешать его во всём скрипте.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Юрий Linux Ответ

    Для того чтобы запретить импорт определенного модуля в Python-скрипте, можно воспользоваться модулем sys и его атрибутом path. Этот метод позволит вам управлять путями поиска модулей и исключать определенные директории или файлы из поиска.

    Прежде всего, необходимо определить, какой модуль вы хотите запретить импортировать. Для примера, давайте предположим, что мы хотим запретить импорт модуля "requests".

    Ниже приведен пример кода, который демонстрирует, как можно ограничить доступ к модулю "requests":

    import sys
     
    def block_module(module_name):
        if module_name in sys.modules:
            del sys.modules[module_name]
        if module_name in sys.path:
            sys.path.remove(module_name)
     
    block_module('requests')

    import sys def block_module(module_name): if module_name in sys.modules: del sys.modules[module_name] if module_name in sys.path: sys.path.remove(module_name) block_module('requests')

    Этот код проверяет, есть ли модуль "requests" в списке импортированных модулей (sys.modules) и в списке путей поиска модулей (sys.path). Если модуль был найден, он удаляется из обоих списков, что препятствует его импортированию в дальнейшем.

    Таким образом, применяя подобный подход, вы можете запретить импорт определенного модуля в Python-скрипте. Помните, что это может повлиять на работоспособность вашего приложения, поэтому будьте осторожны при использовании подобных методов.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно