|
Comparando subprocess.call e subprocess.Popen |
|
| @CanalQb | ||
Ao trabalhar com scripts Python que necessitam interagir com o sistema operacional, a execução de comandos externos é uma funcionalidade frequentemente requerida. Para isso, o Python oferece a biblioteca subprocess, presente na biblioteca padrão, que fornece diversas formas de iniciar e gerenciar subprocessos.
O que é subprocess.call()
O método subprocess.call() executa um comando de forma síncrona. Isso significa que o script aguardará a conclusão do comando externo antes de continuar a execução. É ideal para comandos simples que não exigem manipulação da saída ou interação em tempo real.
O retorno da função é o código de status (exit code) do processo executado, que normalmente é 0 para sucesso e diferente de zero em caso de erro.
O que é subprocess.Popen()
Por outro lado, subprocess.Popen() permite um controle mais avançado sobre os processos. Ele inicia o comando de forma assíncrona e retorna um objeto Popen, que pode ser usado para:
- Capturar a saída padrão (stdout) e o erro (stderr);
- Enviar entradas para o processo via stdin;
- Verificar o status do processo em tempo real;
- Finalizar o processo manualmente, se necessário.
Exemplo prático
O exemplo abaixo mostra a diferença entre os dois métodos, utilizando comandos simples para demonstrar o comportamento síncrono e assíncrono:
import subprocess
# Exemplo com subprocess.call (execução síncrona)
retorno = subprocess.call(["ls", "-l"])
print("Código de retorno:", retorno)
# Exemplo com subprocess.Popen (execução assíncrona)
processo = subprocess.Popen(
["python", "meu_script.py"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
saida, erro = processo.communicate()
codigo_retorno = processo.returncode
print("Saída:", saida.decode())
print("Erro:", erro.decode())
print("Código de retorno:", codigo_retorno)
Explicando o exemplo
No primeiro trecho, subprocess.call() executa o comando ls -l (listar arquivos no Linux/macOS) e aguarda sua finalização. No segundo trecho, subprocess.Popen() inicia um script Python chamado meu_script.py e coleta sua saída e erros com o método communicate().
É importante lembrar de decodificar as saídas obtidas de stdout e stderr, pois elas são retornadas em bytes. O método decode() transforma o conteúdo em string legível.
Quando usar cada um?
A escolha entre call e Popen depende do que você precisa fazer:
- Use
call()se você apenas precisa executar um comando e continuar após sua conclusão. - Use
Popen()se precisa interagir com o processo, capturar saídas, ou executar comandos de forma não bloqueante.
Documentação oficial
Para entender mais sobre o módulo subprocess, consulte a documentação oficial do Python.
Este conhecimento é essencial para criar scripts automatizados, servidores, ferramentas de análise e qualquer outra aplicação que precise interagir com outros programas ou processos do sistema operacional.

Comentários
Comente só assim vamos crescer juntos!