当前位置: 首页 > 面试题库 >

Python-如何在raw_input上设置时间限制

周子平
2023-03-14
问题内容

在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。 这是代码: 问题答案: 用途 :