2 minute read

O Problema Invisível

“Feito imperfeito vence perfeito nunca feito.”
Aldo Novak

Trabalho remotamente e, por questões de segurança, preciso utilizar um sistema operacional separado para o trabalho.

Na prática, isso significa:

👉 Um sistema para trabalhar
👉 Outro sistema para estudar e desenvolver

Até aí tudo bem.

O problema começou quando precisei manter meus projetos Python funcionando nos dois ambientes.

Sempre que mudava de sistema, lá vinha o ritual:

  • Criar ambiente virtual
  • Atualizar o pip
  • Instalar dependências

De novo.
E de novo.
E de novo.

Simples… mas extremamente repetitivo.

E como todo desenvolvedor que começa a sentir dor repetitiva, eu pensei:

“Por que não automatizar isso?”


A Ideia

Ao invés de criar ambientes manualmente toda vez, pensei:

“E se um script resolvesse tudo isso pra mim?”

Objetivo:

  • Detectar se o ambiente virtual existe
  • Verificar se está saudável
  • Criar novamente se necessário
  • Atualizar pip
  • Instalar dependências automaticamente

Primeiro Passo: Localização do Projeto

Usei pathlib para trabalhar com caminhos de forma mais limpa:

from pathlib import Path

ROOT_PATH = Path(__file__).resolve().parent.parent
venv_path = ROOT_PATH / "venv"

Lidando com Diferenças de Sistema Operacional

Aqui veio um ponto importante:

  • Windows → Scripts/python.exe

  • Linux/Mac → bin/python

import os

def get_venv_python() -> Path:
    if os.name == 'nt':
        return venv_path / "Scripts" / "python.exe"
    return venv_path / "bin" / "python"

Mesma lógica para o pip:

import os

def get_venv_pip() -> Path:
    if os.name == 'nt':
        return venv_path / "Scripts" / "pip.exe"
    return venv_path / "bin" / "pip"

Verificando se o Ambiente Está Saudável

Aqui entra um conceito muito importante: usar subprocessos

import subprocess

def is_venv_healthy() -> bool:
    python = get_venv_python()

    if not python.exists():
        return False

    try:
        result = subprocess.run(
            [str(python), "--version"],
            capture_output=True,
            timeout=10,
        )
        return result.returncode == 0
    except (OSError, subprocess.TimeoutExpired):
        return False

💡 Se returncode == 0, deu certo.

Se não, o ambiente está quebrado.

Criando o Ambiente Automaticamente

import shutil
import sys

def create_venv():
    if venv_path.exists():
        print("⚠️ Venv corrompido ou desatualizado. Removendo...")
        shutil.rmtree(venv_path)

    print("🔧 Criando ambiente virtual...")
    subprocess.run([sys.executable, "-m", "venv", str(venv_path)], check=True)

    python_venv = str(get_venv_python())

    subprocess.run([python_venv, "-m", "pip", "install", "--upgrade", "pip"], check=True)

    requirements = ROOT_PATH / "requirements.txt"

    if requirements.exists():
        subprocess.run(
            [python_venv, "-m", "pip", "install", "-r", str(requirements)],
            check=True
        )
        print("✅ Dependências instaladas.")
    else:
        print("⚠️ requirements.txt não encontrado.")

Fluxo Principal

if __name__ == "__main__":
    if is_venv_healthy():
        python = get_venv_python()
        print(f"✅ Venv saudável: {python}")
    else:
        print("🚧 Venv ausente ou corrompido.")
        create_venv()

Por Que Não Ativar Automaticamente?

Aqui entra uma limitação interessante:

Tentei ativar o ambiente virtual via script… e não funcionou.

E o motivo é simples:

Ativar ambiente virtual muda o contexto do terminal, não do subprocesso.

Ou seja, o script não consegue “entrar” no shell atual.

Então optei por algo mais simples e confiável:

if os.name == "nt":
    activate_cmd = str(venv_path / "Scripts" / "Activate.ps1")
    print(f"\n💡 Execute:\n   . '{activate_cmd}'")
else:
    activate_cmd = str(venv_path / "bin" / "activate")
    print(f"\n💡 Execute:\n   source '{activate_cmd}'")

Resultado

Hoje, com um único comando:

python activate_create_virtual.py

Eu tenho:

✅ Ambiente verificado
✅ Pip atualizado
✅ Dependências instaladas

E o melhor:

Economizo pelo menos 15 minutos por dia.

O Ponto Principal

Isso aqui não é sobre virtualenv.

É sobre perceber padrões repetitivos e fazer algo a respeito.

Não é sobre Python.
É sobre quebrar padrões mentais.

E Você?

Tem alguma tarefa repetitiva que você faz todos os dias?

Talvez seja aí que esteja sua próxima automação.

Me conta 👇