setuptools/pkg_resources отключить распространение
Я играл с модулем setuptools pkg_resources для загрузки функций плагина через точки входа. Кажется, что после того, как точка входа была загружена, конкретное распределение, используемое для получения этой точки входа, теперь "активно" (и поэтому сохраняется в pkg_resources.working_set
, sys.path
и несколько других мест).
Мой вопрос: есть ли стандартный способ "деактивировать" дистрибутив? Я не знаю много внутренних деталей загрузки модуля, которая происходит за кулисами, но я взломал следующую функцию, которая работает:
def deactivate(dist):
from pkg_resources import working_set
from sys import path, modules, path_importer_cache
distpath = working_set.by_key.pop(dist).location
working_set.entry_keys.pop(distpath)
working_set.entries.remove(distpath)
path.remove(distpath)
for name, mod in modules.items():
try:
if mod.__file__.startswith(distpath):
modules.pop(name)
except:
pass
Если нет стандартного способа, который я пропустил, сработает ли вышеуказанная функция, как показывает мое ограниченное тестирование? или он пропускает некоторые внутренние операции системного пути или pkg_resources, которые приведут к странным ошибкам в будущем?
Предыстория Я пытаюсь использовать точки входа и яйца, чтобы позволить динамическую загрузку различных версий модуля по усмотрению пользователя. Деактивация становится проблемой только в том случае, если вы хотите разрешить пользователю переключать версии без перезапуска основного сценария, поскольку после загрузки первой версии вы можете использовать только эту версию.