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