Streamlit: Como executar subprocess com exibição ao vivo de stdout na interface web

Este exemplo usa asyncio para executar um subprocess e exibir sua saída ao vivo em uma interface web Streamlit (enquanto o comando ainda está em execução). Isso é útil para processos de longa duração onde você quer mostrar a saída conforme ela chega.

streamlit_subprocess_live_output.py
import streamlit as st
import asyncio

async def run_subprocess():
    # Criar espaço reservado para saída ao vivo
    output_placeholder = st.empty()
    accumulated_output = []

    process = await asyncio.create_subprocess_exec(
        'ping', '-c', '10', '1.1.1.1',
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE,
    )

    # Ler o fluxo stdout
    while True:
        line = await process.stdout.readline()
        if not line:
            break

        line = line.decode().strip()
        accumulated_output.append(line)

        # Atualizar exibição com toda a saída até agora
        output_placeholder.code('\n'.join(accumulated_output))

    # Obter qualquer saída e erros restantes
    stdout, stderr = await process.communicate()
    if stderr:
        st.write("Subprocess errors:")
        st.code(stderr.decode())

async def main():
    st.write("Running subprocess...")
    await run_subprocess()

if __name__ == '__main__':
    asyncio.run(main())

Streamlit stdout ao vivo


Check out similar posts by category: Streamlit Python