Hice una consola interactiva muy simple que me gustaría usar en una aplicación de raspado complicada. Se ve así:¿Por qué mi consola interactiva python no funciona correctamente?
#!/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())
Si llamo desde otra aplicación sencilla, funciona muy bien:
#!/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())
Sin embargo, cuando llamo desde mi marco de raspado que se basa fuera de sarga y mecanizar por ahora (aunque tengo la intención de cambiarlo a gevent) cuando invoco la CLI exactamente de la misma manera, las teclas de flecha no funcionan, la finalización de pestañas no funciona, de hecho se comporta como readline no existe. Intenté volver a cargar el módulo readline y pasarle los comandos directos parse_and_bind, pero por alguna razón no funcionará correctamente. ¿Alguna sugerencia o sugerencia sobre lo que se ha destruido que impide que funcione como se espera o tendré que eliminar todos los módulos externos en uso y ponerlos, uno por uno, para ver qué sucedió?
Sospecho que twill ya que tiene su propia CLI básica, pero si alguien sabe, estaría muy feliz de saber si alguien tiene una buena idea de lo que está pasando.
Ah, y por favor, no hay comentarios sobre lo que estoy haciendo con stderr y stdout, es solo un código repetitivo que se pone en archivos python, siempre los ejecuto desde las consolas utf8 y no es de lo que estoy preguntando ...
Intenté crear el objeto CLI antes de importar cualquier otra cosa o modificar stderr y stdout y luego ejecutar .interact() más tarde, todavía se comporta como si no hubiera readline. – user376403