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:
- ¿Cómo es posible que este personaje escape pueda pasar?
- ¿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.