我正在尝试设置字典sys.modules
在寻找答案时另一个问题 https://stackoverflow.com/q/42134260/2988730并发现了一些有趣的事情。链接的问题涉及消除导入模块的所有影响。基于另一个帖子 https://stackoverflow.com/a/487718/2988730,我想出了删除所有新模块的想法sys.modules
导入后。我最初的实现是执行以下操作(使用numpy
作为要加载和卸载的模块):
# Load the module
import sys
mod_copy = sys.modules.copy()
print('numpy' in mod_copy, 'numpy' in sys.modules) # False False
import numpy
print('numpy' in mod_copy, 'numpy' in sys.modules) # False True
print(id(numpy)) # 45138472
打印输出显示 numpy 已成功导入,并且浅拷贝不包含它,正如预期的那样。
现在我的想法是通过交换来卸载模块mod_copy
回到sys.modules
,然后删除对该模块的本地引用。理论上,这应该删除所有对它的引用(并且可能确实如此):
sys.modules = mod_copy
del numpy
print('numpy' in sys.modules) # False
这应该足以重新导入模块,但是当我这样做时
import numpy
print('numpy' in sys.modules) # False
print(id(numpy)) # 45138472
看来 numpy 模块没有重新加载,因为它具有相同的id
像之前一样。它没有出现在sys.modules
,尽管事实上import
语句不会引发任何错误并且似乎已成功完成(即numpy
模块存在于本地命名空间中)。
另一方面,我在我的答案 https://stackoverflow.com/a/42139290/2988730链接的问题似乎确实工作正常。它直接修改字典而不是交换它:
import sys
mod_copy = sys.modules.copy()
print('numpy' in mod_copy, 'numpy' in sys.modules) # False False
import numpy
print('numpy' in mod_copy, 'numpy' in sys.modules) # False True
print(id(numpy)) # 35963432
for m in list(sys.modules):
if m not in mod_copy:
del sys.modules[m]
del numpy
print('numpy' in sys.modules) # False
import numpy
print('numpy' in sys.modules) # True
print(id(numpy)) # (54941000 != 35963432)
我在 Anaconda 安装上使用 Python 3.5.2。我最感兴趣的是针对 Python 3 的解释,但我对 Python 2.7+ 也很好奇。
我唯一能想到的就是这里发生的事情sys
维护另一个引用sys.modules
并使用该内部参考,无论我对公共参考做了什么。我不确定这是否涵盖了所有内容,所以我想知道到底发生了什么。