Wilberhg's blog

Arquivo .env em Executáveis Python

Entendendo o Conceito

Em desenvolvimento, com o script .py rodando direto pelo editor, a função load_dotenv() encontra o arquivo .env sem problemas, pois procura com base no diretório do arquivo Python original.

O problema aparece ao compilar o script em executável com a opção --onefile do PyInstaller. Nesse modo, o PyInstaller descompacta o código em uma pasta temporária oculta do sistema operacional (geralmente chamada de _MEIPASS). O programa compilado procura o .env dentro dessa pasta temporária, em vez da pasta onde o executável está rodando, e falha ao carregar as configurações.

A solução é calcular o caminho do .env explicitamente: em ambiente compilado, usa-se o diretório do próprio executável; em desenvolvimento, usa-se o diretório do script.

Passo a Passo

  1. Substitua a chamada simples de load_dotenv() pela função abaixo, que detecta o ambiente antes de carregar o arquivo:
import os
import sys
from dotenv import load_dotenv

def carregar_configuracoes():
    # Detecta se o script está rodando como um executável compilado (frozen)
    if getattr(sys, 'frozen', False):
        # Caminho da pasta onde o executável (.exe) está localizado fisicamente
        diretorio_executavel = os.path.dirname(sys.executable)
    else:
        # Caminho em modo de desenvolvimento (rodando o script .py direto no editor)
        diretorio_executavel = os.path.dirname(os.path.abspath(__file__))

    # Define o caminho absoluto para o arquivo .env ao lado do executável
    caminho_env = os.path.join(diretorio_executavel, '.env')

    # Carrega o arquivo .env específico usando o caminho calculado
    load_dotenv(dotenv_path=caminho_env)

# Executa a função para garantir que as variáveis sejam carregadas antes de todo o resto
carregar_configuracoes()

# Agora você pode ler normalmente suas variáveis de ambiente
api_key = os.getenv("API_KEY")
print(f"Chave carregada com sucesso: {api_key}")
  1. Compile o executável com o PyInstaller. O arquivo .env não deve ser embutido no executável, pois geralmente contém dados confidenciais ou valores que o usuário final pode querer alterar; ele deve ficar externo, editável:
pyinstaller --onefile seu_script.py
  1. Localize o executável gerado na pasta dist criada pelo PyInstaller.

  2. Monte a pasta de entrega com o executável e o arquivo .env lado a lado:

MinhaFerramenta/
├── seu_script.exe
└── .env
  1. Para alterar uma configuração, o usuário abre o .env em um editor de texto, salva e executa o programa novamente.

Explicando o código

Observações

Referências

  1. Documentação oficial do python-dotenv: https://github.com/theskumar/python-dotenv
  2. Documentação oficial do PyInstaller: https://pyinstaller.org/

#automation #deployment #dotenv #pyinstaller #python