2016-11-10 153 views
0

当我的代码中的某些模块相互调用时,调试器出现问题。 实例:Python spyder调试死循环导入

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

import cat 
print("Dog") 

文件cat.py如下:

import dog 
print("Cat") 

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

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

谢谢!

回答

2

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

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

(实际上圆形的进口问题比我上面描述有点复杂,但我会离开这个给别人更有见识。)

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

另外:除非它是一个简单的one-shot util或者只依赖于stdlib的东西,否则脚本的内容通常会更好地归结为解析命令行参数/读取配置文件/ main,导入所需的模块并开始有效的过程。

+0

感谢布鲁诺。但是,如何在脚本调试时不工作?有什么不同? – riccio777

+0

@ riccio777我不使用spyder,所以我不能真正知道,但我想它是试图导入您的模块进行检查(在它的真实模块名称下),并尝试处理循环导入时发生错误。 –