Python if __name__=="__main__"无法调用类 Spyder报无限循环错误
问题根因
你写的类定义、方法调用逻辑没有任何语法或逻辑错误,报错和你的业务代码无关,是Spyder IDE内置IPython内核的运行机制导致的:
- 你在类的
__init__初始化方法里直接调用了带input()的阻塞式交互方法,Spyder内核基于asyncio异步框架实现前后端通信,阻塞式的input()调用会打断异步事件循环的正常调度,直接触发TypeError: An asyncio.Future, a coroutine or an awaitable is required错误。 - 错误无限循环打印是因为内核的消息轮询机制会持续重试失败的消息处理任务,每次重试都会触发相同的异步错误,你的类实例化代码根本没机会执行,所以你看不到输入提示、也看不到类方法的打印输出,就会误以为类和方法无法被正常调用。
解决方案
- 代码有效性验证:打开系统终端(CMD/Powershell/Shell),用原生Python解释器直接运行脚本,执行命令为
python 你的脚本文件名.py,可以看到代码完全正常运行,会依次弹出Host、Port输入提示,输入后正常打印y,无任何报错。 - Spyder环境下的处理方式:
- 运行带交互输入的脚本时,选择Spyder菜单栏的「在系统终端中运行」选项,不要走内置IPython内核的运行通道,即可避开异步循环冲突问题。
- 如果必须在IPython控制台内运行,可以在脚本最顶部添加如下代码修补异步嵌套兼容问题:
import nest_asyncio nest_asyncio.apply()
该方案属于兼容补丁,长期运行交互类脚本更推荐使用外部终端。
内容的提问来源于stack exchange,提问作者Magic Dave
相关产品推荐
相关产品推荐

