0

次のパラメーターを取ることができる小さな Python スクリプトを作成する方法を理解しようとしています。

  1. プロンプト - 文字列
  2. 整数としての待機時間
  3. 停止するまでの文字数

最後の 1 つは、プログラムが文字の受け入れを停止して入力の処理を開始する前に入力できる文字数です。一部の人々が Python の select.selectメソッドを使用しているのを見てきましたが、それは 3 番目の項目を考慮していません。スレッドを考えさせるタイムアウトをサポートしているかどうかはわかりませんが、呪いに傾いています。どんな洞察も素晴らしいでしょう!これは、Python 2.6 を使用する Linux で実行されます。

4

2 に答える 2

7

わかりました、私はそれを達成しました: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:])

かなり不完全です。私はそれをテストするためにいくつかの値を入れました。説明のいくつかの言葉:

  1. tty を「raw」モードに切り替える必要があります。そうしないと、Enter キーで確認しないと入力を取得できません。
  2. raw モードでは、入力された文字はデフォルトで出力されなくなりました。ユーザーに入力内容を表示したい場合は、自分で出力する必要があります。
  3. おそらく、Enter や Backspace などの特殊キーを処理したいでしょう — ここに Enter 処理を追加しました。そのためにの部品を再利用できるかもしれませんがcurses
  4. タイムアウトは「最後のキーから 3 秒後」であると想定しています。プロセス全体のタイムアウトが必要な場合、最も簡単な方法は、現在の時刻を取得し、タイムアウトで増やして (つまり get )、秒単位でタイムアウトとしてend_timeに渡すことだと思います。end_time - current_timeselect()
  5. UNIX 固有のインポートをオプションにしました。ただし、Windowsで正しく動作するかどうかはわかりません。
于 2012-08-29T19:03:57.813 に答える