2013-04-02 16 views
8

Sto usando il modulo readline con Python 2.7.3 con Fedora 17. Non ho questo problema con Ubuntu 12.10.Il modulo di lettura Python stampa il carattere di escape durante l'importazione

Durante il import readline, viene visualizzato un carattere di escape.

$ python -c 'import readline' |less 
ESC[?1034h(END) 

Di solito quando ricevo uscita inatteso come questo, maneggiarlo con stdout/stderr reindirizzamento a un descrittore di file fittizio (esempio qui sotto). Ma questa volta, questo metodo non funziona.

import sys 

class DummyOutput(object): 
    def write(self, string): 
     pass 

class suppress_output(object): 
    """Context suppressing stdout/stderr output. 
    """ 
    def __init__(self): 
     pass 
    def __enter__(self): 
     sys.stdout = DummyOutput() 
     sys.stderr = DummyOutput() 
    def __exit__(self, *_): 
     sys.stdout = sys.__stdout__ 
     sys.stderr = sys.__stderr__ 

if __name__ == '__main__': 
    print 'Begin' 
    with suppress_output(): 
     # Those two print statements have no effect 
     # but *import readline* prints an escape char 
     print 'Before importing' 
     import readline 
     print 'After importing' 
    # This one will be displayed 
    print 'End' 

Se si esegue questo frammento in uno script test.py, si vedrà che all'interno del suppress_output contesto, le dichiarazioni print sono infatti soppressa, ma non il carattere di fuga.

$ python test.py |less 
Begin 
ESC[?1034hEnd 
(END) 

Così qui sono le mie due domande:

  1. Come è possibile che questo carattere di escape per arrivare fino in fondo?
  2. Come sopprimerlo?
+1

Sembra che il modulo desideri modificare lo stato del terminale con una sequenza di escape ma che non funziona. Non dovresti cercare di aggirare il problema, risolvilo. – wRAR

+0

Sì, c'è una soluzione basata su questo qui http://reinout.vanrees.org/weblog/2009/08/14/readline-invisible-character-hack.html. Ma questo non ha risposto alla mia prima domanda :) (e temevo che non fosse molto portabile, ma potrei sbagliarmi). – Alex

+0

Sospetto che il tuo terminale e/o il DB terminfo causino questo problema. – wRAR

risposta

0

Per rispondere alla prima domanda: che cambia sys.stdout in realtà non influisce quale file stdout's file descriptor is pointing at, ma invece proprio quello oggetto file di alto livello Python considera stdout. Detto in altro modo, la modifica di sys.stdout influisce sul codice Python, ma non (generalmente) su eventuali estensioni compilate che potresti utilizzare (come il modulo readline). Tutto ciò vale anche per sys.stderr.

Per rispondere al secondo: è possibile fare ciò che suggerisce this answer (che dovrebbe essere semplice per eseguire il porting su Python). Anche se i suggerimenti nei commenti sembrano un modo migliore di andare.

+0

ecco [come reindirizzare stdout a livello C in Python] (http://stackoverflow.com/a/22434262/4279) – jfs

0

ho usato il seguente hack, prima di importare readline

import os 
if os.environ['TERM'] == 'xterm': 
    os.environ['TERM'] = 'vt100' 
# Now it's OK to import readline :) 
import readline 
+1

il problema appare anche con ' xterm-256color' –

+0

ma impostando 'os.environ ['TERM'] = ''' quindi importando 'readline' e quindi ripristinando' os.environ ['TERM'] 'torna a ciò che era prima evita di stampare la sequenza di escape (non sono sicuro delle altre funzionalità di' readline', anche se ...) –

1

qui è quello che sto usando (per ammissione in base alla risposta s' @jypeter), aprendo la variabile TERM ambiente solo se l'uscita non lo fa andare a un tty (ad esempio viene reindirizzato a un file):

if not sys.stdout.isatty(): 

    # remember the original setting 
    oldTerm = os.environ['TERM'] 

    os.environ['TERM'] = '' 

    import readline 

    # restore the orignal TERM setting 
    os.environ['TERM'] = oldTerm 

    del oldTerm 
Problemi correlati