gpt4 book ai didi

python - Unix Python - 超时后无需按 Enter 键即可获取终端输入

转载 作者:行者123 更新时间:2023-12-01 05:50:58 25 4
gpt4 key购买 nike

我想在终端上获取输入并只给几秒钟的时间来响应。当达到超时时,我想读取在接受中输入的所有内容作为给定的输入。 (可选)我希望用户能够按“输入”键提前提交答案。

我有下面的代码,可以正常工作,但需要用户按“enter”键才能提交。它有一个错误:输入文本然后等待超时会将文本保留在“缓冲区”中。然后,当再次提示您输入不同的文本时,按 Enter 键,然后打印两个字符串(请参阅输出)。当达到超时时,我想接受输入的任何内容作为“答案”。我希望用户仍然能够通过按“Enter”键更快地提交答案。

有办法实现所需的行为吗?

注意:我使用的是 Mac OS X

import sys
from select import select

def getResponse(timeout):
print "Enter something:"
rlist, wlist, xlist = select([sys.stdin], [], [], timeout)
if rlist:
result = sys.stdin.readline()
return result
else:
return ''

while True:
response = getResponse(3)
print "Your input is:", response

输出:

Enter something:
pythonYour input is:
Enter something:
dangit
Your input is: pythondangit

最佳答案

您希望以非阻塞方式从终端读取用户输入,并且能够使读取超时,然后无需按 Enter 键即可获取已写入的内容。这至少是有问题的,对此没有一个简单的答案。作为起点,您可以考虑使用以下 ncurses 代码。用户最好不需要删除他的输入!可以调整代码来处理字符删除和许多其他“花哨”功能,最终您可能会得到一个迷你终端。

您所要求的通常是使用事件循环完成的,包括读取部分(其中 raw_input 是一个糟糕的选择)。 GUI 工具包可以更轻松、更稳健地解决这个问题(当然它背后有数千行代码)。

import time
import curses

ENTER_KEY = (curses.KEY_ENTER, ord('\n'), ord('\r'))

def run(win, timeout=3): # timeout in seconds
curses.echo()
win.timeout(0) # Non-block read.

line = 0
while True:
win.addstr(line, 0, "Enter something: ")
s = []
start = time.time()
run = True
while run:
c = win.getch()
time_taken = time.time() - start

if c < 0:
pass
elif c in ENTER_KEY:
break
else:
s.append(chr(c))

if time_taken >= timeout:
# Out of time.
s.append(-1)
run = False

if len(s) == 0:
break
if s[-1] == -1:
s.pop()
answer = ''.join(s)
win.addstr(line + 1, 0, "Your input was: %s" % answer)
line += 2

curses.wrapper(run)

要优雅地结束,请按 Enter 键而不输入任何内容。如果时间用完,它会继续请求输入。我根本没有测试这段代码,我只是知道它有很多限制。

关于python - Unix Python - 超时后无需按 Enter 键即可获取终端输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14310412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com