Có thể sử dụng sys.stdin.read
khi chạy trong PyDev? như sys.stdin.read(1)
đọc 1 dòng từ đầu vào ... Để sử dụng trong giao diện điều khiển Windows và trong PyDev, hãy thực hiện lựa chọn tương tự dựa trên các biến thể chạy và chạy (sử dụng sys.stdin.isatty
). Ví dụ mã tiếp theo đọc đầu vào người dùng được giới hạn thời gian. Nhưng khi chạy trong Windows console nếu đầu vào tiêu chuẩn của chương trình được cấp nước tập trung với đầu ra tiêu chuẩn của một chương trình khác, sau đó trở về sys.stdin.isatty
False
và đầu vào đọc với sys.stdin.read
, không 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")
Đó không phải là thực sự tốt. Xem: https://stackoverflow.com/a/46303939/110451 –