Python では、raw_input() 関数は、ユーザーが何らかの形式の入力を提供するまでスクリプトの実行を一時停止します。ただし、スクリプトが無期限にハングしないように、この入力に時間制限を設定したい場合はどうすればよいでしょうか?
時間制限の実装
Unix ベースのシステムに適用できる 1 つのアプローチは、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 中国語 Web サイトの他の関連記事を参照してください。