首页  >  文章  >  后端开发  >  如何在 Python 中实现有时限的用户输入?

如何在 Python 中实现有时限的用户输入?

Susan Sarandon
Susan Sarandon原创
2024-11-27 07:43:16399浏览

How Can I Implement Time-Bound User Input in Python?

有时限的用户输入:探索解决方案

在动态的编程世界中,通常有必要对用户输入施加时间限制。考虑这样的场景:您想要向用户提出问题并限制他们必须回答的时间。在 Python 中实现此任务可能看起来很简单,但它也带来了一系列挑战。

一种方法涉及利用 线程 模块。通过创建 Timer 对象并设置其持续时间,您可以启动倒计时。在此期间,代码保持阻塞状态,等待用户输入。如果在收到响应之前时间到期,则可以显示适当的消息。下面的代码片段演示了这种方法:

from threading import Timer

timeout = 10
t = Timer(timeout, print, ['Sorry, times up'])
t.start()
prompt = "You have %d seconds to choose the correct answer...\n" % timeout
answer = input(prompt)
t.cancel()

但是,这种方法有其局限性。阻塞主线程可能会阻碍程序中其他任务的执行。因此,允许非阻塞操作的替代方法变得必要。

特定于操作系统的解决方案

对于 Windows 系统,您可以利用 msvcrt 模块,为键盘输入提供低级接口。如果超过指定的时间限制,则会引发 TimeoutExpired 异常,以便您能够相应地处理情况。这是一个实现:

import msvcrt
import time

class TimeoutExpired(Exception):
    pass

def input_with_timeout(prompt, timeout, timer=time.monotonic):
    sys.stdout.write(prompt)
    sys.stdout.flush()
    endtime = timer() + timeout
    result = []
    while timer() < endtime:
        if msvcrt.kbhit():
            result.append(msvcrt.getwche()) #XXX can it block on multibyte characters?
            if result[-1] == '\r':
                return ''.join(result[:-1])
        time.sleep(0.04) # just to yield to other processes/threads
    raise TimeoutExpired

基于 Unix 的增强

在类 Unix 系统上,您可以探索 select 模块。它允许您监视文件描述符并等待指定的事件,包括给定时间范围内的键盘输入。以下代码片段举例说明了此技术:

import select
import sys

def input_with_timeout(prompt, timeout):
    sys.stdout.write(prompt)
    sys.stdout.flush()
    ready, _, _ = select.select([sys.stdin], [],[], timeout)
    if ready:
        return sys.stdin.readline().rstrip('\n') # expect stdin to be line-buffered
    raise TimeoutExpired

或者,您可以使用 signal 模块。通过设置计时器并处理生成的 SIGALRM 信号,您可以对用户输入施加时间限制。具体做法如下:

import signal

def alarm_handler(signum, frame):
    raise TimeoutExpired

def input_with_timeout(prompt, timeout):
    # set signal handler
    signal.signal(signal.SIGALRM, alarm_handler)
    signal.alarm(timeout) # produce SIGALRM in `timeout` seconds

    try:
        return input(prompt)
    finally:
        signal.alarm(0) # cancel alarm

这些方法为限制用户输入的时间提供了非阻塞替代方案,从而在 Python 程序中提供了更大的灵活性和控制力。

以上是如何在 Python 中实现有时限的用户输入?的详细内容。更多信息请关注PHP中文网其他相关文章!

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