2012-08-05 65 views
2

如果提示是使用sys.stdout.writeprint而不是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文檔非常稀少。

回答

2

有沒有其他真正的方法來解決這個問題;而readline有rl_already_prompted變量,它仍然需要傳入提示,以便readline的函數可以正確管理輸入行。

相關問題