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)
想请教大家:
- 第一个场景中的
EOFError是如何产生的?该怎么解决? - 第二个场景里,为什么超时后输入逻辑会卡住?该如何修复?
内容来源于stack exchange
相关产品推荐
相关产品推荐

