我一直在玩setuptools pkg_resources模块,通过入口点加载插件功能。似乎一旦加载了入口点,用于获得该入口点的特定分布现在是“活跃的”#34; (因此保存在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的一些内部工作方式,这将导致奇怪的错误?
背景 我尝试使用入口点和鸡蛋来允许动态加载模块的不同版本,并由用户自行决定。如果您希望允许用户在没有重新启动主脚本的情况下切换版本,则停用只会成为一个问题,因为在加载第一个版本后,您只能使用该版本。