2

これは、プロンプトがsys.stdout.writeまたはprintの代わりに使用されている場合に発生しますraw_input。次のスクリプトはそれを示しています。

$ cat overwrite.py
import readline, sys

if 'libedit' in readline.__doc__:
    readline.parse_and_bind('bind ^I rl_complete')
else:
    readline.parse_and_bind('tab: complete')
def set_completer(choices):
    choices = sorted(map(str,choices))
    def completer(txt, state):
        if state == 0:
            completer.options = [c for c in choices if c.startswith(txt)]
        if state < len(completer.options):
            return completer.options[state]
        return None
    readline.set_completer(completer)

set_completer(['foo','flup'])
sys.stdout.write('input: ')
x = raw_input()
print x

を実行するpython overwrite.pyと、予想されるプロンプト「input:」が表示されます。バックスペースを 1 回押すと、何も削除されません (readline は、既に行頭にあると考えています)。ただし、 「f」を押してからバックスペースを押すと、プロンプトを含む行全体が消去されます。

stdoutに書き込み、ユーザーからの入力を raw_input の呼び出しで取得することを期待しているすべての場所を調べて置き換えなければならないのは非常に不便なので、使用する必要がないことを願っていますraw_input。Python のドキュメントは、readline に関しては、特徴のないほどまばらです。

4

1 に答える 1

2

これを修正する他の方法はありません。readline にはrl_already_prompted変数がありますが、readline の関数が入力行を適切に管理できるように、プロンプトを渡す必要があります。

于 2012-08-05T05:50:42.293 に答える