Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Python io.BytesIO binary stream as {out,err}_stream container

Abierto
#853 5 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Nueva funcionalidad
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
python
Área
cli

Línea de trabajo

Start with invoke/runners.py, especially handle_stdout and write_our_output, and the run wrapper in invoke/util.py. Determine how out_stream and err_stream handle binary file-like objects in synchronous and asynchronous execution; done means BytesIO receives real-time output without the reported TypeError or requiring filesystem storage.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Needs investigation

Hi,
I'm trying to capture and process in real time the output of a command started with run in asynchronous mode, with the out_stream option using an in-memory buffer. So I've used the built-in io library with BytesIO class: is this class supported in your Invoke implementation?

I post the following code example:

import io
import time
from invoke import run

out = io.BytesIO()

run('ls -la && sleep 2 && ls -la', warn=True, pty=True, out_stream=out, asynchronous=True)

time.sleep(1)

while True:
    myline=out.readline()
    print(myline)
    time.sleep(1)
    if not myline:
        out.close()
        break

If you run this code, as you can see, it won't print any binary data despite readline() method is supported by BytesIO class. It seems run method is not writing in the out binary (buffer) object. Furthermore if you put asynchronous to False the script exits with this error:

Traceback (most recent call last):

  File "/usr/local/lib/python3.9/dist-packages/invoke/util.py", line 237, in run
    super(ExceptionHandlingThread, self).run()

  File "/usr/lib/python3.9/threading.py", line 892, in run
    self._target(*self._args, **self._kwargs)

  File "/usr/local/lib/python3.9/dist-packages/invoke/runners.py", line 756, in handle_stdout
    self._handle_output(

  File "/usr/local/lib/python3.9/dist-packages/invoke/runners.py", line 730, in _handle_output
    self.write_our_output(stream=output, string=data)

  File "/usr/local/lib/python3.9/dist-packages/invoke/runners.py", line 718, in write_our_output
    stream.write(encode_output(string, self.encoding))

TypeError: a bytes-like object is required, not 'str'

AFAIK io.BytesIO() is not a 'str' object, it's a binary stream using an in-memory bytes buffer.

Is it possible to use a BytesIO type (for binary data) as a buffer container of {out,err}_stream? If not, is it possible to implement it in Invoke, in order to process the output stream in real time (not when the command, that is very long in my project, has finished) without using filesystem (file-like) objects?

Thank you in advance for your help!

Roberto

Lenguaje dominante
Python
Estrellas
4.8k
Forks
412
Métricas de merge de PR
Sin PR fusionados en 30 d

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de pyinvoke/invoke

Todos los issues de pyinvoke/invoke

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.