わかりました、私はそれを達成しました:D.
#!/usr/bin/env python
import sys
from select import select
def main(argv):
timeout = 3
prompt = '> '
max_chars = 3
# set raw input mode if relevant
# it is necessary to make stdin not wait for enter
try:
import tty, termios
prev_flags = termios.tcgetattr(sys.stdin.fileno())
tty.setraw(sys.stdin.fileno())
except ImportError:
prev_flags = None
buf = ''
sys.stderr.write(prompt)
while True: # main loop
rl, wl, xl = select([sys.stdin], [], [], timeout)
if rl: # some input
c = sys.stdin.read(1)
# you will probably want to add some special key support
# for example stop on enter:
if c == '\n':
break
buf += c
# auto-output is disabled as well, so you need to print it
sys.stderr.write(c)
# stop if N characters
if len(buf) >= max_chars:
break
else:
# timeout
break
# restore non-raw input
if prev_flags is not None:
termios.tcsetattr(sys.stdin.fileno(), termios.TCSADRAIN, prev_flags)
# and print newline
sys.stderr.write('\n')
# now buf contains your input
# ...
if __name__ == "__main__":
main(sys.argv[1:])
かなり不完全です。私はそれをテストするためにいくつかの値を入れました。説明のいくつかの言葉:
- tty を「raw」モードに切り替える必要があります。そうしないと、Enter キーで確認しないと入力を取得できません。
- raw モードでは、入力された文字はデフォルトで出力されなくなりました。ユーザーに入力内容を表示したい場合は、自分で出力する必要があります。
- おそらく、Enter や Backspace などの特殊キーを処理したいでしょう — ここに Enter 処理を追加しました。そのためにの部品を再利用できるかもしれませんが
curses
、
- タイムアウトは「最後のキーから 3 秒後」であると想定しています。プロセス全体のタイムアウトが必要な場合、最も簡単な方法は、現在の時刻を取得し、タイムアウトで増やして (つまり get )、秒単位でタイムアウトとして
end_time
に渡すことだと思います。end_time - current_time
select()
- UNIX 固有のインポートをオプションにしました。ただし、Windowsで正しく動作するかどうかはわかりません。