2010-10-27 12 views
7

Ho creato una console interattiva molto semplice che mi piacerebbe utilizzare in un'applicazione di scraping complicata. Ecco come si presenta:Perché la mia console interattiva Python non funziona correttamente?

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

Se lo chiamo io da un'altra applicazione semplice, funziona bene:

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

Tuttavia, quando lo chiamo io dal mio quadro raschiatura che si basa fuori twill e meccanizzare per ora (anche se ho intenzione di passare a gevent) quando si richiama la CLI esattamente allo stesso modo, i tasti freccia non funzionano, il completamento della tabulazione non funziona, infatti si comporta come se readline non esiste. Ho provato a ricaricare il modulo readline e passarlo direttamente ai comandi parse_and_bind ma per qualche motivo semplicemente non funzionerà correttamente. Qualche suggerimento o suggerimento su ciò che è stato scombinato che gli impedisce di funzionare come previsto o dovrò semplicemente rimuovere tutti i moduli esterni in uso e inserirli, uno per uno, per vedere cosa è successo?

Sono sospettoso di vedere twill in quanto ha il proprio CLI di base, ma se qualcuno sa che sarei molto felice di sapere se qualcuno ha una buona idea di cosa sta succedendo.

Oh e per favore nessun commento su ciò che sto facendo con stderr e stdout, è solo il codice boilerplate che viene inserito nei file python, li faccio sempre girare dalle console utf8 e non è quello che sto chiedendo ...

+0

Ho appena provato a creare l'oggetto CLI prima di importare qualcos'altro o modificare stderr e stdout, quindi eseguire .interact() in seguito, si comporta ancora come se non ci fosse readline. – user376403

risposta

3

OK, ho scoperto che era ME che stava causando il problema, il mio codice caldaia-piastra più vecchio usato per questo prima ho notato che causando problemi in alcuni casi:

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

quel vecchio codice era ancora presente in uno dei miei file, modificando tale codice nella versione di livello inferiore di:

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

Oppure rimuoverlo completamente, poiché non era necessario che fosse presente in quel file, comunque risolto il problema.

Problemi correlati