Как запретить импорт определённого модуля в python-скрипте?
Пример:
Если в любом месте кода написать `import uuid` или `from uuid import <...>`, скрипт не запустится.
При этом библиотеки могут использовать `import uuid` свободно.
Существует ли способ такое сделать?
Дополнительно:
а зачем???
и я целый день потратил на поиск ошибки, когда у меня два set() с ууидами не пересекаются, хотя и должны.
В итоге выяснилось, что в одном множестве лежат uuid.UUID, а в другом fastuuid.UUID,
поэтому эти множества никогда не пересекутся.
Мы подумали, а нельзя ли как-то запретить импорт uuid, раз уж нужно использовать fastuuid, потому что по-любому, кто-нибудь в следующий раз про это забудет и снова потратит кучу времени.
При этом некоторые пакеты в requirements.txt используют uuid, это ок.
Пробовал разобраться, можно ли как-то приспособить под это ast, но так и недоразобрался.
Ответы:
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. Так что либо запрещать импорт модуля в принципе (например, через аудит хук), либо разрешать его во всём скрипте.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы запретить импорт определенного модуля в 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')
Этот код проверяет, есть ли модуль "requests" в списке импортированных модулей (sys.modules) и в списке путей поиска модулей (sys.path). Если модуль был найден, он удаляется из обоих списков, что препятствует его импортированию в дальнейшем.
Таким образом, применяя подобный подход, вы можете запретить импорт определенного модуля в Python-скрипте. Помните, что это может повлиять на работоспособность вашего приложения, поэтому будьте осторожны при использовании подобных методов.