在 spyder 或 IPython 中出现奇怪的模块重新加载行为



我在 spyder 中重新运行脚本时遇到问题,该脚本动态地列出了它自己的一些属性。

这是一个最小的例子,代表了我正在做的事情。我有一个使用普通运行 (F5( 命令运行的源脚本。它运行在它所在的同一目录中:

runfile('C:/some/path/test.py', wdir='C:/some/path')

test.py

import sys
def x():
pass
def y():
pass
x.add = y.add = True
if __name__ == '__main__':
a = [obj for obj in tuple(sys.modules[__name__].__dict__.values())
if getattr(obj, 'add', False)]
print(a)

我可以重新运行此脚本几次,并且始终得到相同的预期结果:

[<function x at 0x0000025E793DBD90>, <function y at 0x0000025E793DB598>]

我希望如果我更改其中一个函数的名称,例如从x更改为f,并将属性赋值更改为f.add = y.add = True,我会得到相同的结果,但x更改为f。相反,我得到

[<function x at 0x0000025E793DB510>, <function y at 0x0000025E793DBBF8>, <function f at 0x0000025E793DBA60>]

鉴于新功能f显示在列表中,但旧x仍然存在,我认为脚本的模块缓存未正确清除。

我一直在使用控制台上的橡皮擦按钮手动清除工作区,但我觉得必须有更好的解决方案,或者至少解释正在发生的事情。也许这是UMR的问题?

我正在运行 Spyder 3.3.3 与以下内容: Python 3.7.3 64 位 |Qt 5.9.6 |PyQt5 5.9.2 |视窗 10, IPython 7.4.9

这是Spyder中的一项功能,旨在允许您从停止点继续运行,尤其是在考虑更长的运行时间来生成特定结果时,并且还为变量资源管理器功能提供支持。

有一种方法可以绕过它,但请按照此答案中的说明在每次运行之前或通过重新启动清除所有变量

但是,正如 roganjosh 所指出的,清除命名空间并不一定更好。

您可以运行一个需要 10 分钟来处理数据的函数并将其返回到全局名称,然后只需对每次后续运行调用的函数进行哈希处理,并且永远不必再次产生处理时间(直到您擦除命名空间,也就是说(。

如果只想重置一个或一组变量,可以使用reset_selective

%reset_selective [-f] regex

最新更新