2010-10-27 37 views
7

我做了一個非常簡單的交互式控制檯,我想在複雜的抓取應用程序中使用。它看起來像這樣:爲什麼我的python交互式控制檯無法正常工作?

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import os, sys, codecs, code 
sys.__stdout__ = codecs.getwriter('utf8')(sys.__stdout__) 
sys.__stderr__ = codecs.getwriter('utf8')(sys.__stderr__) 

if 'DEBUG' in os.environ: 
    import pdb 
    import sys 
    oeh = sys.excepthook 
    def debug_exceptions(type, value, traceback): 
     pdb.post_mortem(traceback) 
     oeh(type, value, traceback) 
    sys.excepthook = debug_exceptions 

class CLI(code.InteractiveConsole): 
    def __init__(self, locals=None, filename="<console>", histfile=None): 
     code.InteractiveConsole.__init__(self, locals, filename) 
     try: 
      import readline 
     except ImportError: 
      pass 
     else: 
      try: 
       import rlcompleter 
       readline.set_completer(rlcompleter.Completer(locals).complete) 
      except ImportError: 
       pass 
      readline.parse_and_bind("tab: complete") 
     self.interact() 

if __name__ == "__main__": 
    hello="I am a local" 
    CLI(locals=locals()) 

如果我把它從另一個簡單的應用程序,它工作得很好:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import os, sys, codecs, cli 
sys.__stdout__ = codecs.getwriter('utf8')(sys.__stdout__) 
sys.__stderr__ = codecs.getwriter('utf8')(sys.__stderr__) 

from cli import CLI 

foo="i am a local" 
CLI(locals=locals()) 

然而,當我把它從我的刮框架,它是基於斷斜紋和機械化現在(儘管我打算將它切換爲gevent)以完全相同的方式調用CLI時,箭頭鍵不起作用,選項卡完成不起作用,實際上它的行爲與readline不同。我已經嘗試重新加載readline模塊並將其直接傳遞給parse_and_bind命令,但由於某些原因,它只是無法正常播放。有什麼暗示或建議可以阻止它按預期工作,或者我將不得不刪除所有正在使用的外部模塊,並將它們一個接一個地看到發生了什麼?

我很懷疑斜視,因爲它有它自己的基本CLI,但如果有人知道我會很高興知道是否有人有一個好主意發生了什麼事。

哦,請不要評論我正在用stderr和stdout做什麼,它只是將樣板代碼放到python文件中,我總是從utf8控制檯運行它,這不是我所問的...

+0

我剛剛嘗試在導入任何其他內容或修改stderr和stdout之後嘗試創建CLI對象,然後運行.interact()以後,它仍表現得像沒有readline一樣。 – user376403 2010-10-27 08:38:43

回答

3

OK,我發現這是我認爲是造成問題,我以前用過這個我的大鍋爐板代碼注意到它導致在某些情況下的問題:

sys.stdout = codecs.getwriter('utf8')(sys.stdout) 
sys.stderr = codecs.getwriter('utf8')(sys.stderr) 

這舊的代碼仍然存在在我自己的文件之一中,將該代碼更改爲以下版本的更低版本:

sys.__stdout__ = codecs.getwriter('utf8')(sys.__stdout__) 
sys.__stderr__ = codecs.getwriter('utf8')(sys.__stderr__) 

或者完全移除它,因爲無論如何都不需要在該文件中解決問題。

相關問題