Python spyder调试冻结循环导入

时间:2016-11-10 14:01:11

标签: python debugging spyder

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

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

import cat
print("Dog")

文件cat.py如下:

import dog
print("Cat")

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

  

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

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

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

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

另外:除非它是一个简单的一次性工具或只依赖于stdlib的东西,你的脚本的内容通常更好地简化为main函数解析命令行参数/读取配置文件/无论如何,导入所需的模块并开始有效的过程。