I wanted to use msvcrt.getch()
in Eclipse with PyDev to read a signe char but I found out that it just don't work (but It works in the Windows console).
Any idea what to do ?
Maybe use sys.stdin.read
when run in PyDev? like sys.stdin.read(1)
read 1 line from input...For use in Windows console and in PyDev make same selection based on os and run variants(using sys.stdin.isatty
). For example next code read timelimited user input. But when run in Windows console if program's standard input is piped in with another program's standard output, then sys.stdin.isatty
returns False
and input read with sys.stdin.read
, not msvcrt.getch
:
import sys, time
import platform
if platform.system() == "Windows":
import msvcrt
else:
from select import select
def input_with_timeout_sane(prompt, timeout, default):
"""Read an input from the user or timeout"""
print prompt,
sys.stdout.flush()
rlist, _, _ = select([sys.stdin], [], [], timeout)
if rlist:
s = sys.stdin.readline().replace('\n','')
else:
s = default
print s
return s
def input_with_timeout_windows(prompt, timeout, default):
start_time = time.time()
print prompt,
sys.stdout.flush()
input = ''
read_f=msvcrt.getche
input_check=msvcrt.kbhit
if not sys.stdin.isatty( ):
read_f=lambda:sys.stdin.read(1)
input_check=lambda:True
while True:
if input_check():
chr_or_str = read_f()
try:
if ord(chr_or_str) == 13: # enter_key
break
elif ord(chr_or_str) >= 32: #space_char
input += chr_or_str
except:
input=chr_or_str
break #read line,not char...
if len(input) == 0 and (time.time() - start_time) > timeout:
break
if len(input) > 0:
return input
else:
return default
def input_with_timeout(prompt, timeout, default=''):
if platform.system() == "Windows":
return input_with_timeout_windows(prompt, timeout, default)
else:
return input_with_timeout_sane(prompt, timeout, default)
print "\nAnswer is:"+input_with_timeout("test?",10,"no input entered")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With