streamlit_run_subprocess.py
import streamlit as st
import asyncio
async def read_stream(stream, accumulated_output):
while True:
line = await stream.readline()
if not line:
break
line = line.decode().strip()
accumulated_output.append(line)
async def run_subprocess(program, *args):
# Criar espaço reservado para saída ao vivo
output_placeholder = st.empty()
accumulated_output = []
process = await asyncio.create_subprocess_exec(
program, *args,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
# Criar tarefas para ler stdout e stderr
stdout_task = asyncio.create_task(read_stream(process.stdout, accumulated_output))
stderr_task = asyncio.create_task(read_stream(process.stderr, accumulated_output))
# Atualizar exibição enquanto streams são lidos
while not stdout_task.done() or not stderr_task.done():
output_placeholder.code('\n'.join(accumulated_output))
await asyncio.sleep(0.1) # Small delay to prevent too frequent updates
# Aguardar conclusão e garantir que toda a saída seja capturada
await asyncio.gather(stdout_task, stderr_task)
result = await process.wait()
# Atualização final da exibição
output_placeholder.code('\n'.join(accumulated_output))
if result != 0:
st.error(f"Command failed with exit code {result}")
else: # Command succeeded
st.success("Command succeeded")
# Em seu aplicativo Streamlit:
if st.button("Run Command"):
asyncio.run(run_subprocess(
'bash',
'-c',
'ping -c 3 1.1.1.1 && echo "Error message" >&2 && ping -c 3 1.1.1.1'
))Saída em caso de sucesso
Saída em caso de falha
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow

