Automatizando Ambientes Virtuais Python: Como Parei de Perder Tempo Todos os Dias
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 👇