我一直在使用 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 的一些内部工作,这会导致奇怪的错误?
背景 我正在尝试使用入口点和鸡蛋来允许用户自行决定动态加载模块的不同版本。仅当您希望允许用户在不重新启动主脚本的情况下切换版本时,停用才会成为问题,因为在加载第一个版本后您只能使用该版本。