提问人:gernophil 提问时间:9/18/2023 最后编辑:gernophil 更新时间:9/18/2023 访问量:85
如何删除/卸载列表中提到的所有模块=
How to delete/unload all modules mentioned in a list=
问:
我想卸载属于特定模块的所有子模块,因为它与另一个模块冲突。这是我的工作:
mainmodule_submodules = [key for key in sys.modules if key.startswith('mainmodule')]
for mainmodule_submodule in mainmodule_submodules:
del mainmodule_submodule # deletes the variable mainmodule_submodule instead of the submodule that's stored in it
del sys.modules[mainmodule_submodule]
问题在于,这会删除由 for 循环创建的变量,而不是存储 的模块。我该怎么做?mainmodule_submodule
mainmodule_submodule
答:
0赞
Thomas
9/18/2023
#1
我不确定您的确切用例是什么。处理卸载模块(并可能稍后再次重新加载它们)听起来非常容易出错。我宁愿建议重构您的代码以减少技术债务,而不是实施变通方法。
但是,如果您想卸载模块,只需使用(如果您不希望导入的模块再可用)。del sys.modules[module]
del globals()[module]
注意:我缩短了您的变量名称,以便在此示例上下文中提高可读性。
import os
import sys
print(os.path.join("a", "b", "c"))
modules = [key for key in sys.modules if key.startswith('os')]
for module in modules:
if module in sys.modules:
print(f"Unloading {module}")
del sys.modules[module]
if module in globals():
del globals()[module]
# this should fail
print(os.path.join("a", "b", "c"))
在不知道冲突在哪里的情况下,如果在您自己的代码中,也许您可以通过使用别名来避免冲突。
import os as os_alias
print(os_alias.pathjoin("a", "b", "c"))
评论
del sys.modules[mainmodule_submainmodule]
sys.submainmodules