首页  >  文章  >  后端开发  >  如何在 Python 的 `raw_input()` 函数中设置用户输入的时间限制?

如何在 Python 的 `raw_input()` 函数中设置用户输入的时间限制?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-18 22:45:02944浏览

How can you set a time limit on user input in Python's `raw_input()` function?

自定义具有时间约束的原始输入

在 Python 中,raw_input() 函数会暂停脚本的执行,直到用户提供某种形式的输入。但是,如果您想对此输入设置时间限制以防止脚本无限期挂起,该怎么办?

实现时间限制

适用于基于 Unix 的系统的一种方法是使用 signal.alarm 函数。当以秒为单位的时间限制调用时,此函数会在指定的持续时间后引发 KeyboardInterrupt 异常,从而有效地跳过 raw_input() 调用。

跨平台解决方案

为了跨平台兼容性或者如果您使用的是 Windows,另一种方法是结合使用 threading.Timer 和 thread.interrupt_main .

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

请注意,此方法以相同的方式处理用户启动的输入和超时,对于两种情况都返回 None 。如果需要区分这些情况,可以修改代码,在发生超时时设置一个标志,并在 KeyboardInterrupt 处理程序中单独处理。

特定于 Windows 的实现

对于特定于 Windows 的解决方案,您可以利用轮询 msvcrt.kbhit 的循环来检查用户输入,同时监视时间确保强制执行超时。

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':
                return ''.join(result)
            time.sleep(0.1)
        else:
            if time.time() > finishat:
                return None

考虑默认值

如果您想避免在超时时返回 None,您可以修改代码以指定在这种情况下要返回的替代默认值。

高级自定义

为了防止时间限制适用于单纯打字速度较慢的用户,您可以在每次输入字符后重新计算超时,确保计时器仅如果输入确实长时间暂停,则过期。

以上是如何在 Python 的 `raw_input()` 函数中设置用户输入的时间限制?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn