2010-10-27 38 views
7

Tôi đã tạo một bảng điều khiển tương tác rất đơn giản mà tôi muốn sử dụng trong một ứng dụng cào phức tạp. Nó trông giống như thế này:Tại sao giao diện điều khiển tương tác python của tôi không hoạt động đúng?

#!/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()) 

Nếu tôi gọi nó từ một ứng dụng đơn giản, nó chỉ hoạt động tốt:

#!/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()) 

Tuy nhiên, khi tôi gọi nó từ khung cào của tôi mà là dựa tắt chéo và cơ giới hóa bây giờ (mặc dù tôi dự định chuyển nó thành gevent) khi gọi CLI theo cách tương tự, các phím mũi tên không hoạt động, hoàn thành tab không hoạt động, trên thực tế nó hoạt động như readline không tồn tại. Tôi đã cố gắng tải lại các mô-đun readline và đi qua nó parse_and_bind lệnh trực tiếp nhưng đối với một số lý do nó chỉ sẽ không chơi đúng cách. Bất kỳ gợi ý hay gợi ý nào về những gì đã bị che khuất ngăn cản nó hoạt động như mong đợi hay tôi sẽ phải loại bỏ tất cả các mô-đun bên ngoài đang sử dụng và đặt chúng vào từng cái một để xem điều gì đã xảy ra?

Tôi nghi ngờ twill thấy vì nó có CLI cơ bản của riêng nó nhưng nếu có ai biết tôi rất vui khi biết nếu có ai có ý tưởng hay về những gì đang diễn ra. Oh và xin vui lòng không có ý kiến ​​về những gì tôi đang làm với stderr và stdout, nó chỉ là mã boilerplate được đưa vào các tập tin python, tôi luôn luôn chạy chúng từ bàn giao tiếp utf8 và nó không phải là những gì tôi yêu cầu ... Logged

+0

Tôi vừa cố thử tạo đối tượng CLI trước khi nhập bất kỳ thứ gì khác hoặc sửa đổi stderr và stdout rồi chạy .interact() sau, nó vẫn hoạt động như không có readline. – user376403

Trả lời

3

OK, tôi phát hiện ra nó là ME đã gây ra vấn đề, già đang nồi hơi-đĩa của tôi quen với việc này trước khi tôi nhận thấy nó gây ra vấn đề trong một số trường hợp:

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

đó mã cũ là vẫn còn hiện diện trong một trong các tệp của riêng tôi, thay đổi mã đó thành phiên bản cấp thấp hơn của:

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

Hoặc xóa hoàn toàn vì không cần phải nằm trong tệp đó, đã khắc phục sự cố.

Các vấn đề liên quan