gpt4 book ai didi

python - 如何设置 raw_input 的时间限制

转载 作者:太空宇宙 更新时间:2023-11-04 06:34:33 25 4
gpt4 key购买 nike

在 python 中,有没有办法在等待用户输入时计算时间,以便在 30 秒后自动跳过 raw_input() 函数?

最佳答案

signal.alarm不幸的是,@jer 推荐的解决方案所基于的函数仅适用于 Unix。如果您需要跨平台或特定于 Windows 的解决方案,您可以基于 threading.Timer相反,使用 thread.interrupt_main从计时器线程向主线程发送 KeyboardInterrupt。即:

import thread
import threading

def raw_input_with_timeout(prompt, timeout=30.0):
print(prompt, end=' ')
timer = threading.Timer(timeout, thread.interrupt_main)
astring = None
try:
timer.start()
astring = input(prompt)
except KeyboardInterrupt:
pass
timer.cancel()
return astring

无论是 30 秒超时还是用户明确决定按下 control-C 以放弃输入任何内容,这都会返回 None ,但是以相同的方式处理这两种情况似乎没问题(如果你需要区分,您可以为计时器使用您自己的函数,在中断主线程之前,在某个地方记录超时 has 发生的事实,并在您的处理程序中用于 KeyboardInterrupt 访问那个“某处”来区分这两种情况中的哪一种发生了)。

编辑:我本可以发誓这是有效的,但我一定是错的——上面的代码省略了明显需要的 timer.start()and 即使有了它,我也无法让它继续工作。 select.select 显然是另一件值得尝试的事情,但它不适用于 Windows 中的“普通文件”(包括标准输入)——在 Unix 中,它适用于所有文件,在 Windows 中,仅在套接字上。

所以我不知道如何进行跨平台的“带超时的原始输入”。可以使用紧密循环轮询构建特定于 Windows 的 msvcrt.kbhit ,执行一个msvcrt.getche(并检查它是否返回以指示输出已完成,在这种情况下它会跳出循环,否则会累积并继续等待)并检查时间是否超时需要。我无法测试,因为我没有 Windows 机器(它们都是 Mac 和 Linux 机器),但这里的未测试代码我建议:

import msvcrt
import time

def raw_input_with_timeout(prompt, timeout=30.0):
print(prompt, end=' ')
finishat = time.time() + timeout
result = []
while True:
if msvcrt.kbhit():
result.append(msvcrt.getche())
if result[-1] == '\r': # or \n, whatever Win returns;-)
return ''.join(result)
time.sleep(0.1) # just to yield to other processes/threads
else:
if time.time() > finishat:
return None

评论中的 OP 说他不想在超时时 return None,但是有什么选择呢?引发异常?返回不同的默认值?无论他想要什么替代方案,他都可以清楚地用它代替我的return None;-)。

如果您不想因为用户打字而超时(而不是根本不打字!-),您可以在每次成功输入字符后重新计算 finishat。

关于python - 如何设置 raw_input 的时间限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13121121/

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