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

Flask及Flask-SocketIO场景下终端input获取用户输入遇EOFError及超时后异常的问题求助

Flask及Flask-SocketIO场景下终端input获取用户输入遇EOFError及超时后异常的问题求助

我现在遇到了两个和Flask/Flask-SocketIO结合终端用户输入相关的问题,想求助大家帮忙解决:

问题一:Flask路由结合线程+input时触发EOFError

我最初想在Flask的POST路由里,通过终端获取用户输入并设置超时时间,但运行时触发接口就会抛出EOFError('EOF when reading a line')错误。

我的实现代码如下:

import queue
import threading
from flask import Flask
from inputimeout import inputimeout, TimeoutOccurred

def ask_input(prompt, result_queue):
    try:
        result = input(prompt)
        result_queue.put(result)
    except Exception as e:
        result_queue.put(None)  # 此处会捕获到EOFError

class FakeInterface:
    def __init__(self):
        self.app = Flask(__name__)

        @self.app.route('/ihm_notification', methods=["POST"])
        def __ihm_notification():
            try:
                prompt = "ok: y/n?"
                timeout = 10
                q = queue.Queue()
                t = threading.Thread(target=ask_input, args=(prompt, q))
                t.daemon = True
                t.start()
                try:
                    return q.get(timeout=timeout)  # 最多等待<timeout>秒
                except queue.Empty:
                    return None
                except TimeoutOccurred:
                    print(f"User answer too long")
            except Exception as error:
                print("error")

    def run(self, host: str, port: int):
        self.app.run(host=host, port=port)

fi = FakeInterface()
fi.run()

触发/ihm_notification接口时,直接抛出错误:EOFError('EOF when reading a line')


问题二:Flask-SocketIO场景下超时后输入逻辑卡住

后来我换成Flask-SocketIO(Websocket)的方式,用inputimeout库实现带超时的输入。测试发现:

  • 若在超时时间内输入内容,服务器能正常将结果返回给客户端;
  • 若某次请求未在超时内输入,之后所有请求都会直接返回'nono',输入逻辑像是被卡住了,无法再正常获取终端输入。

我的SocketIO代码如下:

from flask import Flask
from flask_socketio import SocketIO, emit
from inputimeout import inputimeout, TimeoutOccurred

app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins="*")

@socketio.on('message')
def message(data):
    try:
        reponse = inputimeout(prompt="ezzer", timeout=5)
        emit('response', {'from': reponse})
    except Exception:
        emit('response', {'from': 'nono'})

if __name__ == '__main__':
    socketio.run(app, port=8000, debug=True, allow_unsafe_werkzeug=True)

想请教大家:

  1. 第一个场景中的EOFError是如何产生的?该怎么解决?
  2. 第二个场景里,为什么超时后输入逻辑会卡住?该如何修复?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 06:40:29