파이썬에서 사용자 입력을 기다리는 동안 시간을 계산하여 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
'파이썬' 카테고리의 다른 글
파이썬 Python-목록의 가중치 평균 (0) | 2020.11.26 |
---|---|
파이썬 IOError : [Errno 13] 권한이 거부되었습니다. (0) | 2020.11.26 |
파이썬 wxPython, StaticText () 값 설정 (0) | 2020.11.26 |
파이썬 대용량 CSV 파일을 부분적으로 어떻게 읽을 수 있습니까? (0) | 2020.11.26 |
파이썬 현재 모듈에서 setattr ()을 어떻게 호출합니까? (0) | 2020.11.26 |
댓글