'reload'的递归版本

39
当我开发Python代码时,通常会在解释器中以临时方式进行测试。我会import some_module,测试它,发现错误,修复错误并保存,然后使用内置的reload函数来reload(some_module)并再次测试。
然而,假设在some_module中我有import some_other_module,并且在测试some_module时我发现了some_other_module中的一个bug并修复它。现在调用reload(some_module)不会递归重新导入some_other_module。我要么手动重新导入依赖项(例如reload(some_module.some_other_module)import some_other_module; reload(some_other_module)),或者如果我已经更改了一堆依赖项并且失去了追踪需要重新加载的内容,那么我需要重新启动整个解释器。
更方便的方法是如果有一些recursive_reload函数,我可以只需执行recursive_reload(some_module)就能让Python不仅重新加载some_module,还可以递归重新加载每个some_module导入的模块(以及每个这些模块导入的模块等等),以便我可以确保没有使用任何旧版本的some_module依赖其他模块。
我认为Python没有内置类似于我在这里描述的recursive_reload函数,但是否有一种简单的方法可以将它们组合在一起?

可能是重复的问题:如何在Python中找到依赖于特定模块的模块列表 - jsbueno
11个回答

-1

我还没有阅读和尝试理解代码,但我确实尝试将defs粘贴到解释器中,并在我的模块上调用reload_dependences: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 9, in reload_dependences ImportError: 无法重新初始化内部模块__main__ - Mark Amery
嗯,我认为错误消息表明它尝试重新加载“__main__”模块本身 - 在这种情况下,是您的解释器会话。尝试将该代码粘贴到一个单独的文件中,然后再导入到解释器中,如果我没记错的话,那就是我开发它的方式。 - jsbueno
试过了。同样的错误。顺便说一下,对于稍微慢的回复,抱歉。 - Mark Amery
你不会在6年后来点踩这个回答,是吧? :-) 顺便说一句,在当今大型Python项目中自动重新加载是很常见的事情 - 你应该检查一下Flask和Django在其“调试模式”中使用的内容。 - jsbueno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接