首頁  >  文章  >  後端開發  >  如何在 Python 的 `raw_input()` 函數中設定使用者輸入的時間限制?

如何在 Python 的 `raw_input()` 函數中設定使用者輸入的時間限制?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-18 22:45:02945瀏覽

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