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 调试因循环导入而冻结的主要内容,如果未能解决你的问题,请参考以下文章
TKinter (filedialog.askdirectory) 冻结 Spyder 控制台