본문 바로가기
파이썬

파이썬 raw_input에 시간 제한을 설정하는 방법

by º기록 2020. 11. 26.
반응형

파이썬에서 사용자 입력을 기다리는 동안 시간을 ​​계산하여 30 초 후에 raw_input () 함수를 자동으로 건너 뛰는 방법이 있습니까?

 

해결 방법

 


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

30 초 시간이 초과되거나 사용자가 명시 적으로 control-C를 눌러 입력을 포기하기로 결정하더라도 None을 반환하지만 두 경우를 동일한 방식으로 처리하는 것이 좋습니다 (구별해야하는 경우 사용할 수 있습니다. 타이머의 경우 메인 스레드를 중단하기 전에 타임 아웃이 발생한 사실을 어딘가에 기록하고 KeyboardInterrupt 에 대한 처리기에 "어딘가 "두 사건 중 어느 사건이 발생했는지 구별하기 위해).

편집 : 이것이 작동한다고 맹세 할 수도 있었지만 제가 틀렸을 것입니다. 위의 코드는 당연히 필요한 timer.start () , and <를 생략했습니다. / em> 그것으로도 더 이상 작동하지 않습니다. select.select 는 시도해 볼만한 다른 방법이지만 Windows의 "일반 파일"(stdin 포함)에서는 작동하지 않습니다. Unix에서는 모든 파일, Windows에서만 작동합니다. 소켓에.


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':   # or \n, whatever Win returns;-)
                return ''.join(result)
            time.sleep(0.1)          # just to yield to other processes/threads
        else:
            if time.time() > finishat:
                return None

댓글의 OP는 시간 초과시 반환 없음 을 원하지 않는다고 말하지만 대안은 무엇입니까? 예외가 발생합니까? 다른 기본값을 반환 하시겠습니까? 그가 원하는 대안이 무엇이든 그는 내 return None ;-) 대신에 그것을 분명히 둘 수 있습니다.

사용자가 느리게 입력하고 있다는 이유만으로 타임 아웃을 원하지 않는 경우 (아무것도 입력하지 않는 것이 아니라!-), 성공적인 문자 입력 후 finishat를 다시 계산할 수 있습니다.

 

참조 페이지 https://stackoverflow.com/questions/2933399

 

 

반응형

댓글