2
如果提示是使用sys.stdout.write
或print
而不是raw_input
寫入的,則會發生這種情況。下面的腳本演示了:當用戶點擊退格鍵時,python readline lib刪除整行
$ 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
,你會得到預期的提示:「輸入」。如果你回退一次,沒有任何東西被刪除(readline認爲它已經在線的開頭,我猜)。如果你點擊'f'然後退格鍵,然而,包括提示在內的整行被擦除。
這將是非常不方便,必須要經過和替換寫到標準輸出和我希望從與調用的raw_input獲取用戶輸入的所有地方,所以我希望這是沒有必要使用raw_input
。有關readline的python文檔非常稀少。