Python spyder 调试因循环导入而冻结

Posted

技术标签:

【中文标题】Python spyder 调试因循环导入而冻结【英文标题】:Python spyder debug freezes with circular importing 【发布时间】:2017-03-24 14:11:40 【问题描述】:

当我的代码中的某些模块相互调用时,我的调试器出现问题。 实际例子:

文件 dog.py 包含以下代码:

import cat
print("Dog")

文件cat.py如下:

import dog
print("Cat")

当我运行 dog.py(或 cat.py)时,我没有任何问题,程序运行顺利。 但是,当我尝试调试它时,整个 spyder 死机了,我必须终止程序。

你知道我该如何解决这个问题吗?我想使用这种循环导入,因为模块使用其他模块中的功能。

谢谢!

【问题讨论】:

【参考方案1】:

当我运行 dog.py(或 cat.py)时,我没有任何问题,程序运行顺利。

AFAICT 这主要是因为脚本是以特殊名称 ("__main__") 导入的,而模块是以其自己的名称 (此处为“狗”或“猫”) 导入的。注意:脚本和模块之间的唯一区别实际上是加载 - 将参数传递给 python 运行时 (python dog.py) 或从脚本或任何带有 import 语句的模块导入。

(实际上循环导入问题比我上面描述的要复杂一些,但我会把它留给更有知识的人。)

长话短说:除了这个特殊的用例(实际上更多的是副作用),Python 确实支持循环导入。如果您有其他脚本或模块共享的函数(类,等等),请将这些函数放在不同的模块中。或者,如果您发现两个模块确实相互依赖,您可能只想将它们重新组合成一个模块(或将相互依赖的部分重新组合在同一个模块中,并将其他所有内容重新组合在一个或多个其他模块中)。

另外:除非它是一个微不足道的一次性实用程序或仅依赖于 stdlib 的东西,否则您的脚本内容通常最好简化为 main 函数解析命令行参数/读取配置文件/无论什么,导入所需的模块并启动有效的过程。

【讨论】:

谢谢布鲁诺。但是为什么脚本在调试时不起作用?有什么区别? @riccio777 我不使用 spyder,所以我无法确定,但我想它正在尝试导入您的模块进行检查(在它的真实模块名称下)并且在尝试处理通知时出错进口。

以上是关于Python spyder 调试因循环导入而冻结的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使用 Spyder 进行高效调试?

TKinter (filedialog.askdirectory) 冻结 Spyder 控制台

从Spyder的命令行调试Python函数(或类)

为啥要导入 pdb; pdb.set_trace 在 Spyder 中以不同方式调用时会触发两种不同的调试场景?

如何使用spyder调试python代码

使用 Spyder 调试远程 python 文件