You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:10:43