如果使用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:”。如果你按一次退格键,没有任何内容被删除(readline认为它已经在行的开头,我猜)。然而,如果你点击'f'然后退格,那么整个行,包括提示都会被删除。
我必须经历并替换我写入stdout 和的所有地方非常不方便我希望通过调用raw_input从用户那里获得输入,所以我希望没有必要使用raw_input
。关于readline,python文档非常稀疏。
答案 0 :(得分:2)
没有其他真正的方法来解决这个问题;虽然readline具有rl_already_prompted
变量,但它仍然需要传递提示,以便readline的函数可以正确地管理输入行。