una paquetes modulos lista libreria importar hacer crear como comando clases bibliotecas biblioteca python import stdout readline io-redirection

paquetes - lista de modulos de python



El módulo de lectura de Python imprime caracteres de escape durante la importación (3)

Estoy usando el módulo readline con Python 2.7.3 con Fedora 17. No tengo este problema con Ubuntu 12.10.

Durante la línea de import readline , se muestra un carácter de escape.

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

Por lo general, cuando obtengo un resultado inesperado como este, lo manejo usando la redirección stdout/stderr a un descriptor de archivo ficticio (ejemplo a continuación). Pero esta vez, este método no funciona.

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

Si ejecuta este fragmento en una test.py comandos test.py , verá que dentro del contexto suppress_output , las instrucciones de print están efectivamente suprimidas , pero no el carácter de escape.

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

Así que aquí están mis dos preguntas:

  1. ¿Cómo es posible que este personaje escape pueda pasar?
  2. ¿Cómo suprimirlo?

He utilizado el siguiente hack, antes de importar readline

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


esto es lo que estoy usando (admitiéndolo en base a la respuesta de @jypeter), borrando la variable de entorno TERM solo si la salida no va a un tty (por ejemplo, se está redirigiendo a un archivo):

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


Para responder a la primera pregunta: cambiar sys.stdout realidad no afecta a qué archivo está apuntando el descriptor de archivo de stdout , sino qué objeto de archivo de alto nivel Python considera stdout. Dicho de otra manera, cambiar sys.stdout afecta su código Python, pero no (generalmente) cualquier extensión compilada que pueda estar usando (como el módulo readline). Todo esto se aplica a sys.stderr también.

Para responder el segundo: puede hacer lo que sugiere esta respuesta (que debería ser sencillo para portar a Python). Aunque las sugerencias en los comentarios suenan como una mejor manera de hacerlo.