如何删除/卸载列表中提到的所有模块=

How to delete/unload all modules mentioned in a list=

提问人:gernophil 提问时间:9/18/2023 最后编辑:gernophil 更新时间:9/18/2023 访问量:85

问:

我想卸载属于特定模块的所有子模块,因为它与另一个模块冲突。这是我的工作:

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_submodulemainmodule_submodule

蟒蛇 德尔

评论

0赞 mkrieger1 9/18/2023
你在找吗? 不存在。del sys.modules[mainmodule_submainmodule]sys.submainmodules
0赞 user2357112 9/18/2023
这将造成更严重的问题。现在,这些子模块不仅与其他模块冲突,而且一旦某些原因导致这些模块再次加载,它们也会开始与自己的替代版本发生冲突。
0赞 gernophil 9/18/2023
@mkrieger1,是的,你是对的。这是交换文字的错误。我会纠正它。
0赞 gernophil 9/18/2023
@user2357112,在这种情况下,您建议怎么做?
0赞 user2357112 9/18/2023
@gernophil:取决于原始冲突发生的方式和原因。看着你链接的问题......如果这就是你遇到的问题,那么你可能只是被搞砸了,直到库维护者修复它。您必须停止使用其中一个冲突的库。

答:

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"))

评论

0赞 gernophil 9/18/2023
谢谢,这真的很有帮助。我的问题不在于命名空间,而在于以某种方式依赖两者的模块,但如果 PyTorch 独立于它加载,则第二个会导致错误PyTorch