python3:我正在尝试允许用户给定的时间输入输入,但是在给定的时间之后,如果他们还没有输入任何内容,我想要中止输入并将默认值分配给存储输入的变量,或者以其他方式将默认值馈送到给定时间段之后的输入语句中。
我已经尝试过:
from threading import Timer
timeout = 2
t = Timer(timeout, print, ["nSorry, time is up"])
t.start()
answer = input("You have 2 seconds to answer:")
t.cancel()
print(answer)
来自其他堆栈溢出帖子,但问题在于,即使执行了最终行并打印了answer
,解释器仍会提示用户输入,这对我试图做的事情都不起作用(本质上,当玩家不给它输入时需要继续进行的命令行游戏,但在接收输入时进行更新(。
最好的方法是什么?我知道Python确实没有超时函数或类似的功能,但是有任何方法可以通过系统命令或模块实现此目标?
有几种合理的方法(其中一些可能是Unix特定的(:
- 读取可以在超时后可以
kill
的subprocess
中的输入。(包括subprocess.run
在内的许多功能接受timeout
参数以自动化此。( - 使用
alarm
或类似地发送您自己的过程信号(并安装抛出异常的signal
处理程序(。 - 有另一个线程
close
超时后正在读取的描述符;这听起来很剧烈,但通常据说可以工作,只要您不小心open
在使用dup2
恢复之前封闭描述符上的文件。 - 阅读具有较低级别设施(如非阻止
read
和select
(的输入 - 不幸的是,它将禁用readline
等好东西。
无论如何,您必须决定在超时之前输入的不完整但非空输入。终端驱动程序可能会默认情况下将其视而不见地传输到下一个输入提示。
使用select
调用可能是一种更简单的方法。
import sys, select
print "You have ten seconds to answer!"
i, o, e = select.select( [sys.stdin], [], [], 10 )
if (i):
print "You said", sys.stdin.readline().strip()
else:
print "You said nothing!"
请参阅带有超时的键盘输入?