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
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