Estoy usando Python ftplib
para escribir un pequeño cliente FTP, pero algunas de las funciones en el paquete no devuelven la salida de la cadena, sino que imprimen en stdout
. Quiero redirigir stdout
a un objeto del que pueda leer la salida.
Sé que stdout
se puede redirigir a cualquier archivo normal con:
stdout = open("file", "a")
Pero prefiero un método que no use el disco local.
Estoy buscando algo como BufferedReader
en Java que se pueda usar para envolver un búfer en una secuencia.
stdout = open("file", "a")
por sí solo redirija nada.Respuestas:
fuente
stdout
objeto original , ya que siempre está disponible ensys.__stdout__
. Ver docs.python.org/library/sys.html#sys.__stdout__ .finally:
bloque, por lo que también se reasigna si se produce una excepción en el medio.try: bkp = sys.stdout ... ... finally: sys.stdout = bkp
Hay una función contextlib.redirect_stdout () en Python 3.4:
Aquí hay un ejemplo de código que muestra cómo implementarlo en versiones anteriores de Python .
fuente
redirect_stderr
en la última Python también!Solo para agregar a la respuesta de Ned anterior: puede usar esto para redirigir la salida a cualquier objeto que implemente un método de escritura (str) .
Esto se puede usar con buenos resultados para "capturar" la salida estándar en una aplicación GUI.
Aquí hay un ejemplo tonto en PyQt:
fuente
Comenzando con Python 2.6, puede usar cualquier cosa que implemente la
TextIOBase
API desde el módulo io como reemplazo. Esta solución también le permite usarsys.stdout.buffer.write()
en Python 3 para escribir (ya) cadenas de bytes codificadas en stdout (ver stdout en Python 3 ). UsarStringIO
no funcionaría entonces, porque nisys.stdout.encoding
tampocosys.stdout.buffer
estaría disponible.Una solución usando TextIOWrapper:
Esta solución funciona para Python 2> = 2.6 y Python 3.
Tenga en cuenta que nuestro nuevo
sys.stdout.write()
solo acepta cadenas Unicode ysys.stdout.buffer.write()
solo acepta cadenas de bytes. Es posible que este no sea el caso del código antiguo, pero a menudo es el caso del código que está construido para ejecutarse en Python 2 y 3 sin cambios, lo que a menudo hace uso de élsys.stdout.buffer
.Puede crear una ligera variación que acepte cadenas unicode y de bytes para
write()
:No es necesario establecer la codificación del búfer en sys.stdout.encoding, pero esto ayuda cuando se utiliza este método para probar / comparar la salida del script.
fuente
Este método restaura sys.stdout incluso si hay una excepción. También obtiene cualquier salida antes de la excepción.
Probado en Python 2.7.10 usando
io.BytesIO()
Probado en Python 3.6.4 usando
io.StringIO()
Bob, agregado para un caso si siente que algo de la experimentación de código modificado / extendido puede ser interesante en algún sentido, de lo contrario, siéntase libre de eliminarlo
fuente
Un administrador de contexto para python3:
usar así:
fuente
En Python3.6, los módulos
StringIO
ycStringIO
se han ido, debe usarlos en suio.StringIO
lugar, por lo que debe hacer esto como la primera respuesta:fuente
Use
pipe()
y escriba en el descriptor de archivo apropiado.https://docs.python.org/library/os.html#file-descriptor-operations
fuente
Aquí hay otra versión de esto.
contextlib.redirect_stdout
conio.StringIO()
lo documentado es genial, pero sigue siendo un poco detallado para el uso diario. A continuación, le mostramos cómo hacerlo de una sola línea subclasificandocontextlib.redirect_stdout
:Como __enter__ devuelve self, tiene el objeto de administrador de contexto disponible después de que sale el bloque with. Además, gracias al método __repr__, la representación de cadena del objeto del administrador de contexto es, de hecho, stdout. Así que ahora tienes
fuente