2010-10-27 9 views
7

J'ai fait une console interactive très simple que j'aimerais utiliser dans une application de grattage compliquée. Il ressemble à ceci:Pourquoi ma console interactive python ne fonctionne pas correctement?

#!/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 je l'appelle d'une autre application simple, il fonctionne très 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()) 

Cependant, quand je l'appelle de mon cadre racleuse qui est basé sur twill et mécaniser pour l'instant (bien que j'aie l'intention de passer en gevent) quand appeler la CLI exactement de la même manière, les flèches ne fonctionnent pas, la complétion de tabulation ne fonctionne pas, en fait elle se comporte comme readline n'existe pas. J'ai essayé de recharger le module readline et de lui passer les commandes directes parse_and_bind mais pour une raison quelconque, il ne fonctionnera pas correctement. Des indices ou des suggestions sur ce qui a été tabassé qui l'empêchent de fonctionner comme prévu ou est-ce que je vais devoir enlever tous les modules externes utilisés et les mettre, un par un, pour voir ce qui s'est passé? Je me méfie de Twill vu qu'il a son propre CLI de base, mais si quelqu'un sait, je serais très heureux de savoir si quelqu'un a une bonne idée de ce qui se passe. Oh, et s'il vous plaît, pas de commentaires sur ce que je fais avec stderr et stdout, c'est juste du code standard qui est placé dans des fichiers python, je les exécute toujours depuis les consoles utf8 et ce n'est pas ce que je demande ...

+0

J'ai juste essayé d'essayer de créer l'objet CLI avant d'importer autre chose ou de modifier le stderr et stdout puis en exécutant .interact() plus tard, il se comporte toujours comme s'il n'y avait pas readline. – user376403

Répondre

3

OK, j'ai découvert qu'il était mE qui a été à l'origine du problème, mon ancien code plaque de chaudière utilisée pour cela avant je l'ai remarqué à l'origine des problèmes dans certains cas:

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

ce vieux code était toujours présent dans un de mes propres fichiers, en changeant ce code à la version de niveau inférieur de:

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

Ou le supprimer complètement, car il n'a pas besoin d'être dans ce fichier de toute façon résolu le problème.

Questions connexes