2010-10-27 19 views
7

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

+0

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

Respuesta

3

bien, descubrí que era yo que estaba causando el problema, mi código de la caldera de la placa más antigua utilizada para esto antes de que se dio cuenta causando problemas en algunos casos:

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

ese código antiguo todavía estaba presente en uno de mis propios archivos, cambiando ese código a la versión de nivel inferior de:

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

O quitarlo por completo, ya que no tenía que estar en ese archivo de todos modos soluciona el problema.

Cuestiones relacionadas