Chciałem użyć msvcrt.getch()
w Eclipse z PyDev do odczytu znaku signe, ale okazało się, że to po prostu nie działa (ale działa w konsoli Windows).Używanie msvcrt.getch() w Eclipse/PyDev
Każdy pomysł co robić?
Chciałem użyć msvcrt.getch()
w Eclipse z PyDev do odczytu znaku signe, ale okazało się, że to po prostu nie działa (ale działa w konsoli Windows).Używanie msvcrt.getch() w Eclipse/PyDev
Każdy pomysł co robić?
Może używać sys.stdin.read
podczas uruchamiania w PyDev? jak sys.stdin.read(1)
odczytać 1 linię z wejścia ... Aby użyć w konsoli Windows i PyDev, dokonaj tego samego wyboru w oparciu o warianty os i run (używając sys.stdin.isatty
). Na przykład następny kod odczytuje czasowo wprowadzone dane przez użytkownika. Ale kiedy uruchomić w konsoli Windows, jeśli standardowe wejście programu jest wyprowadzony w standardowym wyjściu z innego programu, a następnie sys.stdin.isatty
powraca False
i wejście odczytane z sys.stdin.read
, nie 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")
To naprawdę nie jest to możliwe. Zobacz: https://stackoverflow.com/a/46303939/110451 –