Como executar comandos do terminal com Python em 2 minutos

Publicado em: 25/02/2026
Tempo de leitura: 9 minutos

Aprender a interagir com o sistema operacional é um dos grandes marcos na jornada de quem está decidindo aprender Python. Imagine poder automatizar a criação de pastas, mover arquivos ou até mesmo configurar servidores com apenas algumas linhas de código. Saber como executar comandos do terminal com Python em 2 minutos não é apenas um truque de produtividade, é uma habilidade fundamental para qualquer desenvolvedor que deseja criar ferramentas de automação robustas e integradas ao ambiente de trabalho.

O Python oferece bibliotecas nativas poderosas que servem como uma ponte entre o seu script e o shell do sistema (seja o Prompt de Comando no Windows, o Bash no Linux ou o Terminal no macOS). Neste guia prático, vamos focar no módulo subprocess, que é a recomendação oficial da Python Software Foundation para substituir módulos mais antigos como o os.system. Prepare seu editor de código, pois vamos transformar seu terminal em um aliado automatizado.

Por que usar Python para comandos de terminal?

Muitas vezes, já temos ferramentas de linha de comando que fazem exatamente o que precisamos, como o git, docker ou utilitários de rede. Em vez de reescrever toda essa lógica em Python puro, faz mais sentido chamar essas ferramentas diretamente. Isso economiza tempo e permite que você aproveite o melhor de cada tecnologia. Além disso, ao integrar comandos de terminal em seus scripts de automação com Python, você consegue tratar os erros de forma muito mais elegante do que em um arquivo .bat ou .sh tradicional.

Outra vantagem clara é a portabilidade. Embora os comandos em si possam mudar entre sistemas operacionais, a estrutura do código Python permanece a mesma. Você pode verificar qual sistema o usuário está utilizando através do módulo os em Python e adaptar o comando dinamicamente, mantendo a inteligência do script centralizada.

O Coração da Execução: O Módulo subprocess

Para começar a executar comandos do terminal com Python, o método mais seguro e moderno é o subprocess.run(). Ele foi introduzido no Python 3.5 para simplificar a vida do programador, unificando diversas funções complexas em uma interface única. Ele permite que você envie o comando, espere a execução terminar e capture o resultado (ou o erro) de forma organizada.

A sintaxe básica do subprocess.run

A forma mais simples de invocar um comando é passando uma lista de strings, onde o primeiro elemento é o comando principal e os seguintes são os argumentos. Veja como listar os arquivos de um diretório:

Python
import subprocess

# Executa o comando 'ls' no Linux/Mac ou 'dir' no Windows
subprocess.run(["ls", "-l"])

Note que o uso de listas evita problemas de segurança conhecidos como “Shell Injection”, onde usuários mal-intencionados poderiam tentar executar comandos extras inesperados. Se você estiver utilizando o Windows, o comando correspondente seria ["dir"] e talvez precise do argumento adicional shell=True.

Capturando a Saída do Comando

Executar o comando e ver o resultado no console é útil, mas e se você precisar salvar essa resposta em uma variável para processar depois? Por exemplo, ler o IP da máquina ou verificar a versão de um software instalado. Para isso, usamos os parâmetros capture_output=True e text=True.

Python
import subprocess

resultado = subprocess.run(["echo", "Olá do Terminal"], capture_output=True, text=True)

print("Saída do comando:", resultado.stdout)

O parâmetro text=True (também conhecido como universal_newlines) é essencial para que o Python converta os bytes recebidos do sistema em uma string legível, evitando que você tenha que lidar com erros de codificação UTF-8 manualmente. Se o comando falhar, o erro será capturado no atributo resultado.stderr.

Tratamento de Erros e Segurança

Na programação real, os comandos do sistema podem falhar por diversos motivos: um arquivo que não existe, falta de permissão ou um comando digitado incorretamente. Para garantir que seu script não pare de funcionar abruptamente, é boa prática utilizar o argumento check=True dentro de um bloco de tratamento de exceções.

Python
import subprocess

try:
    # Tentando executar um comando que não existe
    subprocess.run(["comando_inexistente"], check=True)
except subprocess.CalledProcessError as e:
    print(f"Ocorreu um erro ao executar: {e}")
except FileNotFoundError:
    print("O comando solicitado não foi encontrado no sistema.")

Ao usar check=True, o Python levanta uma exceção automaticamente se o comando retornar um código de erro. Isso permite que você combine essa lógica com o uso de try excpet em Python para criar robôs de automação resilientes que sabem o que fazer quando algo sai do planejado.

Executando Comandos Complexos com Shell=True

Existem casos onde você precisa usar recursos específicos do shell, como pipes (|), redirecionamentos (>) ou variáveis de ambiente complexas. Nesses cenários, passamos o comando como uma string única e definimos shell=True. No entanto, use isso com cautela e nunca passe entradas diretas de usuários sem validação.

Python
import subprocess

# Usando um pipe para contar arquivos (Linux/Mac)
comando = "ls | wc -l"
resultado = subprocess.run(comando, shell=True, capture_output=True, text=True)

print(f"Total de arquivos: {resultado.stdout}")

Essa abordagem é comum quando estamos construindo interfaces de linha de comando (CLI) em Python, onde o objetivo é interagir profundamente com as ferramentas do sistema operacional de forma rápida e direta.

Diferença entre subprocess.run e os.system

Se você pesquisar em fóruns antigos como o Stack Overflow, encontrará muitos exemplos usando os.system('comando'). Embora pareça mais fácil no início, o os.system é considerado obsoleto para a maioria das tarefas modernas. Ele não permite capturar a saída facilmente, não lida bem com erros e é muito menos flexível que o subprocess.

Recursoos.systemsubprocess.run
Captura Saída (stdout)NãoSim
Tratamento de ErrosBásico (Código de retorno)Avançado (Exceções)
SegurançaBaixaAlta (Uso de listas)
RecomendaçãoLegadoUso Atual

Exemplo Prático: Criando um Backup Automatizado

Vamos aplicar o conhecimento de como executar comandos do terminal com Python em um cenário real. Imagine que você precisa compactar uma pasta de documentos importante usando o comando nativo do sistema e movê-la para um local de backup. Este tipo de script de backup automático é extremamente comum em servidores web.

Python
import subprocess
import datetime

def realizar_backup():
    data = datetime.datetime.now().strftime("%Y-%m-%d")
    nome_arquivo = f"backup_{data}.zip"
    
    print(f"Iniciando backup em: {nome_arquivo}...")
    
    try:
        # Comando para zipar uma pasta (Exemplo para Linux/Mac)
        # No Windows, você poderia usar o comando 'tar' que já vem nas versões novas
        subprocess.run(["zip", "-r", nome_arquivo, "meus_documentos/"], check=True)
        print("Backup concluído com sucesso!")
    except subprocess.CalledProcessError:
        print("Erro crítico: Não foi possível realizar o backup.")

realizar_backup()

Avançando com Processos Assíncronos

Às vezes, você quer disparar um comando que demora muito para terminar (como um download pesado ou uma renderização) e não quer que seu script Python fique travado esperando. Para isso, usamos a classe subprocess.Popen ou a biblioteca asyncio no Python. O Popen inicia o processo em segundo plano, permitindo que seu código continue executando outras tarefas simultaneamente.

Dominar essas chamadas de sistema é o primeiro passo para criar ferramentas que interagem com o mundo exterior. Seja para gerenciar instalações de bibliotecas via pip programaticamente ou para monitorar processos do sistema, o Python se torna o “cola” ideal para unir diferentes utilitários.

Código Completo do Projeto: Monitor de Sistema Simples

Abaixo, apresento um código funcional que você pode copiar e testar agora mesmo. Ele identifica o seu sistema operacional e executa comandos de rede para testar sua conexão, demonstrando captura de saída e tratamento de erros.

Python
import subprocess
import platform

def monitor_sistema():
    sistema = platform.system()
    print(f"Sistema detectado: {sistema}")
    
    # Define o comando baseado no SO (Windows usa 'n', Unix usa 'c')
    parametro = "-n" if sistema == "Windows" else "-c"
    comando = ["ping", parametro, "1", "8.8.8.8"]
    
    print("Testando conexão com o Google (DNS 8.8.8.8)...")
    
    try:
        # Executa e captura a saída
        resultado = subprocess.run(comando, capture_output=True, text=True, timeout=5)
        
        if resultado.returncode == 0:
            print("Conexão ativa! Detalhes abaixo:")
            print(resultado.stdout)
        else:
            print("Falha na conexão. O servidor não respondeu.")
            
    except subprocess.TimeoutExpired:
        print("Erro: O comando demorou demais para responder.")
    except Exception as e:
        print(f"Erro inesperado: {e}")

if __name__ == "__main__":
    monitor_sistema()

Perguntas Frequentes

Como executar um comando do terminal e manter a janela aberta?

Se você estiver no Windows e quiser que uma janela do CMD apareça e permaneça, você deve chamar o comando antecedido de cmd /k. No entanto, para automação, geralmente preferimos rodar tudo de forma silenciosa e capturar os logs.

O comando subprocess.run() substitui o os.system()?

Sim. O subprocess.run() é mais flexível, seguro e recomendado pelas normas atuais da linguagem Python (PEP) para qualquer execução de comandos externos.

Como lidar com senhas no terminal via Python?

Nunca escreva senhas diretamente no código. Use variáveis de ambiente ou bibliotecas como getpass. O subprocess permite enviar dados para a entrada padrão (stdin) do comando, o que é mais seguro.

Por que recebo FileNotFoundError ao tentar rodar um comando?

Isso geralmente acontece quando o comando não está no “PATH” do sistema. Verifique se o programa que você tenta abrir está instalado ou forneça o caminho completo do executável (ex: /usr/bin/git).

Posso executar scripts de outras linguagens com Python?

Com certeza. Você pode usar subprocess.run(["node", "script.js"]) ou subprocess.run(["php", "arquivo.php"]) da mesma forma que faria manualmente no terminal.

O shell=True é perigoso em todos os casos?

Não é perigoso se o comando for uma string fixa definida por você. O risco existe quando você concatena variáveis que vêm de inputs de usuários na string do comando.

Como interromper um comando que está demorando muito?

Use o argumento timeout no subprocess.run(). Se o tempo limite for atingido, o Python lançará uma exceção TimeoutExpired que você pode tratar facilmente no código.

Como executar vários comandos sequencialmente?

Você pode chamar subprocess.run() múltiplas vezes ou criar um pequeno script de shell e chamá-lo uma única vez pelo Python. A segunda opção costuma ser mais organizada para sequências longas.

Ao integrar o poder do Python com a versatilidade do terminal, você abre portas para automações incríveis, desde a limpeza de arquivos temporários até o deploy completo de aplicações. Continue explorando e veja como essa ferramenta pode simplificar sua rotina de desenvolvimento!

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Fundamentos
    Foto do Leandro Hirt

    Descubra como criar geradores eficientes com yield no Python

    Você já sentiu que seu computador travou ao tentar processar uma lista gigantesca de dados? Isso acontece porque, por padrão,

    Ler mais

    Tempo de leitura: 9 minutos
    25/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Transforme seu script Python em .exe em 5 minutos

    Você criou um script incrível, automatizou tarefas repetitivas ou desenvolveu uma ferramenta útil, mas agora surge o problema: como compartilhar

    Ler mais

    Tempo de leitura: 10 minutos
    24/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Como gerar e editar planilhas Excel com Python em minutos

    Gerar e editar planilhas Excel com Python em minutos é uma das habilidades mais valiosas para quem busca aumentar a

    Ler mais

    Tempo de leitura: 12 minutos
    23/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Como descompactar arquivos .zip em Python sem erro

    Aprender como descompactar arquivos .zip em Python sem erro é uma das habilidades mais práticas para quem está começando no

    Ler mais

    Tempo de leitura: 10 minutos
    22/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Como criar e usar dataclasses em Python facilmente

    No vasto ecossistema da programação, gerenciar dados em classes pode, muitas vezes, parecer uma tarefa repetitiva e cansativa. Se você

    Ler mais

    Tempo de leitura: 9 minutos
    18/02/2026
    Fundamentos
    Foto do Leandro Hirt

    Entendendo o operador walrus (:=) no Python

    O ecossistema do Python é conhecido por sua simplicidade e legibilidade, mas isso não significa que a linguagem pare de

    Ler mais

    Tempo de leitura: 9 minutos
    18/02/2026