使用aioconsole.ainput()后调用input()触发EOFError问题求助
问题原因
aioconsole.ainput() 会通过异步IO接管标准输入(stdin)的处理逻辑,当你用 asyncio.run() 执行完小游戏的协程后,异步事件循环关闭时,可能没有正确恢复stdin的原始状态,导致后续同步的 input() 函数无法读取到输入流,触发 EOFError。
解决方案
方案一:统一使用aioconsole的输入替代同步input()
将代码中所有的 input() 调用替换为 aioconsole.ainput() 的同步执行形式,确保输入处理逻辑一致:
比如把 show_score 函数里的:
input('Hit enter to continue.')
修改为:
import aioconsole import asyncio asyncio.run(aioconsole.ainput('Hit enter to continue.'))
方案二:在小游戏结束后恢复标准输入状态
在 minigame() 函数的末尾,重新打开标准输入流,修复被aioconsole修改的状态:
import sys import os def minigame(): # 原有的小游戏代码... # 函数末尾添加恢复stdin的代码 if sys.platform.startswith('win32'): # Windows系统 sys.stdin = open('CON', 'r') else: # Unix/Linux/macOS系统 sys.stdin = open('/dev/tty', 'r')
方案三:替换aioconsole.ainput(),用原生asyncio监听stdin
如果不想依赖aioconsole,可以用 asyncio.add_reader() 实现异步输入监听,避免破坏同步input()的环境:
修改小游戏的输入处理逻辑:
import asyncio import sys async def getInput(): global flag flag = False loop_task = asyncio.create_task(loop()) # 用asyncio原生方法监听stdin input_received = asyncio.Event() def on_input(): sys.stdin.readline() # 读取输入内容 input_received.set() asyncio.get_running_loop().add_reader(sys.stdin.fileno(), on_input) await input_received.wait() asyncio.get_running_loop().remove_reader(sys.stdin.fileno()) flag = True await loop_task return loop_task.result()
内容的提问来源于stack exchange,提问作者Zarquon
相关产品推荐
相关产品推荐

