我做了一個非常簡單的交互式控制檯,我想在複雜的抓取應用程序中使用。它看起來像這樣:爲什麼我的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控制檯運行它,這不是我所問的...
我剛剛嘗試在導入任何其他內容或修改stderr和stdout之後嘗試創建CLI對象,然後運行.interact()以後,它仍表現得像沒有readline一樣。 – user376403 2010-10-27 08:38:43