ホームページ >バックエンド開発 >Python チュートリアル >Python でユーザー入力の時間制限を実装するにはどうすればよいですか?

Python でユーザー入力の時間制限を実装するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-16 17:42:03975ブラウズ

How to Implement a Time Limit for User Input in Python?

Python でユーザー入力の時間制限を実装する方法

raw_input() 関数の使用中に、必要な状況が発生する可能性があります。事前定義された期間の経過後に入力を終了します。幸いなことに、Python はこの要件に対処するためのソリューションをいくつか提供しています。

Unix のみの方法:

@jer の提案では、Unix でのみ利用できる signal.alarm 関数を利用します。システム。この関数は、指定されたタイムアウトに達すると、KeyboardInterrupt 例外を発生させます。次のコードは、このアプローチの例を示しています。

import signal

def raw_input_with_timeout(prompt, timeout):
    signal.alarm(timeout)
    try:
        return input(prompt)
    except KeyboardInterrupt:
        return None
    finally:
        signal.alarm(0)  # Reset alarm to avoid interference

クロスプラットフォームおよび Windows 固有のメソッド:

クロスプラットフォームまたは Windows 固有のソリューションの場合は、 threading.Timer クラスと thread.interrupt_main。このアプローチでは、タイマー スレッドからメイン スレッドに KeyboardInterrupt を送信します。以下のコードは、このメソッドを示しています。

import threading

def raw_input_with_timeout(prompt, timeout):
    print(prompt, end=' ')
    timer = threading.Timer(timeout, thread.interrupt_main)
    result = None
    try:
        timer.start()
        result = input(prompt)
    except KeyboardInterrupt:
        pass
    timer.cancel()
    return result

Windows 固有のメソッド (未テスト):

Windows 環境では、msvcrt を使用してタイムアウトを実現できます。このアプローチには、タイトなループ内でキー押下をポーリングし、最大時間に達するか改行文字が検出されるまで入力を蓄積することが含まれます。

import msvcrt
import time

def raw_input_with_timeout(prompt, timeout):
    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 以外のタイムアウト戻り値が必要な場合は、上記のコード スニペットの return None ステートメントを単純に置き換えます。さらに、各キーストロークの後に終了を調整すると、入力ペーシングに基づいてタイムアウトを調整できます。

以上がPython でユーザー入力の時間制限を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。