在python中,有没有一种方法可以在等待用户输入时计数时间,以便在30秒后raw_input()
自动跳过该函数?
@ jer
推荐的解决方案所基于的signal.alarm
函数仅适用于Unix。如果您需要跨平台或Windows特定的解决方案,则可以将其基于threading.Timer
,使用thread.interrupt_mainKeyboardInterrupt
从计时器线程将a发送到主线程。即:
import thread
import threading
def raw_input_with_timeout(prompt, timeout=30.0):
print prompt,
timer = threading.Timer(timeout, thread.interrupt_main)
astring = None
try:
timer.start()
astring = raw_input(prompt)
except KeyboardInterrupt:
pass
timer.cancel()
return astring
无论30秒超时还是用户明确决定按Control-C放弃输入任何内容,这都将返回None,但是以相同的方式处理这两种情况似乎可以(如果需要区分,则可以使用定时器自己的功能,中断主线程之前,记录某处的事实超时已经发生了,在你的处理器的KeyboardInterrupt访问是“地方”来区分这两个案件发生)。
编辑:我可以发誓,这是工作,但我一定是错的-上面省略了代码显然需要的timer.start(),而且即使它,我不能做任何更多的工作。 select.select显然还有其他尝试,但是在Windows中的“普通文件”(包括stdin)上将不起作用-在Unix中,Windows中的所有文件都只能在套接字上工作。
所以我不知道如何做一个跨平台的“原始输入超时”。可以使用紧密循环轮询msvcrt.kbhit来构造特定于Windows的窗口,然后执行一次msvcrt.getche(并检查是否返回以指示输出已完成,在这种情况下,它会跳出循环,否则累积并一直等待)并检查如果需要,可以超时。我无法测试,因为我没有Windows机器(它们都是Mac和Linux机器),但是在这里,我建议使用未经测试的代码:
import msvcrt
import time
def raw_input_with_timeout(prompt, timeout=30.0):
print prompt,
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。
问题内容: 我目前从EntityManager查询中收到连接超时错误。是否可以为这些设置超时? persistence.xml 代码在我的线程的运行功能中超时: 我收到的超时错误: 问题答案: 是的,那里有 javax.persistence.query.timeout 。根据JPA 2.0规范,对此查询提示的支持是可选的: 可移植应用程序不应依赖此提示。根据使用的持久性提供程序和数据库,可能会或
问题内容: 我有一个返回String的方法,是否有可能在一段时间后超出该阈值以返回该特定字符串? 问题答案: 该番石榴库有一个非常好的,可以让你做到这一点,就会向由接口定义的任何方法。它可以为具有“内置”超时的对象生成代理。
问题内容: 我在Java函数中运行正则表达式来解析文档,如果找到了由正则表达式指定的字符串,则返回true,否则,则返回false。但是问题在于,当文档不包含正则表达式指定的字符串时,返回false花费的时间很长,如果要花费6秒钟以上的时间来执行,我想终止该函数。 我如何在该功能上设置6秒的时限,以便在超过6秒时强行终止该功能。 我从类1调用类2的方法“方法1”。“方法1”调用相同类的“方法2”,
问题内容: 我已经按照kuester2000的回答进行了操作,但是我的超时设置似乎不起作用。 但是,超时值不变。 在我链接的答案中,它还说: 连接超时抛出“ java.net.SocketTimeoutException:套接字未连接”,套接字超时抛出“ java.net.SocketTimeoutException:操作超时”。 但是我都没有。相反,我收到“ org.apache.http.co
问题内容: 是否可以在没有exe安装程序的情况下在Windows中为Python 2.6安装Setuptools? 目前还没有一个内置的工具,Setuptools的维护者表示可能要过一阵子。 有谁知道如何安装它吗? 问题答案: 第一种选择-在线安装(即在整个安装过程中保持与Internet的连接): 下载setuptools-0.6c9.tar.gz 使用7-zip将其解压缩到Windows Py
问题内容: 我的网站上有这片js可以切换图像,但是第二次单击图像时需要延迟。延迟应为1000ms。因此,您将单击img.jpg,然后将出现img_onclick.jpg。然后,您将单击img_onclick.jpg图像,然后应该有1000ms的延迟,然后才能再次显示img.jpg。 这是代码: 问题答案: 用途 :