Deseja otimizar a gestão da sua configuração? Descubra como manipular variáveis de ambiente com Python.
Durante meu aprendizado autodidata em Python, desenvolvia projetos práticos para solidificar o conhecimento recém-adquirido. Alguns desses projetos envolviam a conexão e consulta de bancos de dados por meio do Python. Isso demandava o armazenamento de configurações de banco de dados e informações sigilosas, como nomes de usuário e senhas para autenticação.
Incorporar tais informações confidenciais diretamente no código Python não era recomendável. Foi então que aprendi a utilizar arquivos de configuração e variáveis de ambiente, juntamente com os módulos internos do Python para interagir com eles.
Sempre que necessito empregar dados sensíveis, como senhas e chaves de API em minhas aplicações, opto por defini-las como variáveis de ambiente, buscando-as conforme a necessidade. Neste guia, demonstrarei o conceito de variáveis de ambiente e como manuseá-las em Python.
O que são Variáveis de Ambiente?
Variáveis de ambiente são elementos externos à sua aplicação, utilizados para armazenar dados de configuração, parâmetros do sistema e outros. Sua gestão é comumente feita pelo sistema operacional ou ambiente da aplicação. As características primordiais de variáveis de ambiente englobam:
- Pares Chave-Valor: Variáveis de ambiente são formadas por um nome (chave) e um valor correspondente.
- Âmbito do Sistema: É possível definir variáveis de ambiente em nível de sistema, tornando-as acessíveis a todos os processos em execução. Alternativamente, podem ser definidas no escopo da aplicação, afetando apenas essa instância.
- Dinâmicas e Modificáveis: Variáveis de ambiente podem ser alteradas durante a execução, proporcionando flexibilidade.
Benefícios das Variáveis de Ambiente
Variáveis de ambiente oferecem diversas vantagens para a gestão de configurações e dados confidenciais em suas aplicações Python:
- Separação de Responsabilidades: Ao armazenar configurações fora do código, você isola a gestão de configurações da lógica da aplicação.
- Segurança: Permitem o armazenamento de dados sensíveis, como chaves de API e credenciais de bancos de dados, fora do código-fonte, diminuindo o risco de exposição.
- Flexibilidade: Facilitam a atualização das configurações, uma vez que as modificações podem ser feitas externamente ao código. Permitem ajustar configurações sem alterações no código, sendo especialmente útil para implantações em diferentes ambientes ou ao atualizar credenciais.
Nas próximas seções, abordaremos como definir, acessar e gerenciar variáveis de ambiente em Python, e como elas aprimoram o gerenciamento de configurações em seus projetos.
Como Definir Variáveis de Ambiente
Variáveis de ambiente podem ser definidas via linha de comando. O escopo dessas variáveis se restringe à sessão atual e não persiste fora dela.
Em sistemas Mac ou Linux, a definição de uma variável de ambiente em sua sessão de terminal é feita da seguinte forma:
export MY_VARIABLE=meu_valor
Em sistemas Windows, uma variável de ambiente pode ser definida temporariamente conforme abaixo:
set MY_VARIABLE=meu_valor
Acessando Variáveis de Ambiente em Python
Python disponibiliza o módulo os para funcionalidades relacionadas ao sistema operacional. `os.environ` funciona como um dicionário de variáveis de ambiente. Os nomes das variáveis e seus valores são as chaves e valores do dicionário, respectivamente.
Assim, é possível acessar valores de variáveis de ambiente através de suas chaves, similar ao acesso a elementos de um dicionário.
Confira alguns exemplos:
import os print(os.environ['HOME']) # Saída: /home/balapriya
print(os.environ['USER']) # Saída: balapriya
Até agora, tudo certo. Mas o que acontece ao tentar acessar o valor de uma variável de ambiente que não foi definida?
Vamos tentar acessar a variável `API_KEY`, que ainda não configuramos:
print(os.environ['API_KEY'])
Como esperado, um `KeyError` será levantado:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<frozen os>", line 679, in __getitem__ KeyError: 'API_KEY'
Tratando Erros de Chave
É possível tratar o `KeyError` da seguinte forma:
import os try: api_key = os.environ['API_KEY'] print(f'API_KEY configurada como: {api_key}') except KeyError: print('API_KEY não definida. Configure-a, por favor.')
Essa abordagem evita que a execução do programa seja interrompida abruptamente quando uma exceção `KeyError` é gerada, apresentando uma mensagem de erro descritiva:
# Saída API_KEY não definida. Configure-a, por favor.
Dessa forma, se o restante do programa não executar conforme o esperado, saberemos que esquecemos de definir uma variável de ambiente necessária.
Acessando Variáveis de Ambiente com o Método `get()`
O método `get()` do dicionário permite obter o valor de uma variável de ambiente. Em vez de `KeyError`, o método `get()` retorna `None` caso a variável não seja encontrada.
Acessando a variável `NOT_SET`, que não foi definida, resulta em `None`:
print(os.environ.get('NOT_SET')) # Saída: None
Em minha preferência, opto por gerar um erro de chave quando a variável de ambiente não está definida, ao invés de omitir silenciosamente ou retornar `None` como o método `get()` faz.
Entretanto, o método `get()` se mostra útil quando desejamos fornecer um valor padrão para uma variável de ambiente específica caso ela não esteja definida.
Veja este exemplo:
print(os.environ.get('HOME','/home/usuario')) # Saída: /home/balapriya
Gerenciando Configurações com Variáveis de Ambiente
Vejamos agora alguns exemplos práticos de como podemos usar variáveis de ambiente em nossa aplicação.
Exemplo 1: Configurando Parâmetros de Conexão de Banco de Dados
Suponha que você queira se conectar a um banco de dados PostgreSQL usando Python. Para isso, você pode instalar e utilizar o conector `psycopg2`:
pip install psycopg2
Neste exemplo, usamos variáveis de ambiente para configurar os parâmetros de conexão com o banco de dados. Se as variáveis de ambiente não estiverem definidas, fornecemos valores padrão para uso.
import os import psycopg2 # Obtém as configurações do banco de dados através das variáveis de ambiente db_host = os.environ.get('DB_HOST', 'localhost') db_port = os.environ.get('DB_PORT', '5432') db_user = os.environ.get('DB_USER', 'meuusuario') db_password = os.environ.get('DB_PASSWORD', 'minhasenha') # Estabelece uma conexão com o banco de dados try: connection = psycopg2.connect( host=db_host, port=db_port, user=db_user, password=db_password, database="meubanco" ) print('Conectado ao banco de dados!') except Exception as e: print(f'Erro ao conectar ao banco de dados: {e}')
Exemplo 2: Gerenciando Chaves de API
Vamos analisar outro exemplo que envolve o uso de chaves de API.
Além da interface do ChatGPT, você pode empregar a API da OpenAI para integrar modelos LLMs da OpenAI em seus aplicativos.
Ao se inscrever em uma conta OpenAI, você geralmente recebe créditos de API gratuitos por tempo limitado. Para obter sua chave de API, navegue até Configurações > Exibir chaves de API.
Você pode utilizar o SDK da OpenAI em Python e um framework como LangChain para construir aplicativos. Para isso, é necessário instalar as bibliotecas (em um ambiente virtual) através do pip:
pip install openai pip install langchain
Veja como você pode definir `OPENAI_API_KEY` como uma variável de ambiente:
import os os.environ["OPENAI_API_KEY"]='sua-chave-api'
Agora você pode acessar os modelos LLMs da Open AI em seu script da seguinte forma:
from langchain.llms import OpenAI model=OpenAI(model_name="gpt-3.5-turbo")
Como Modificar Variáveis de Ambiente em Python
O dicionário `os.environ` do módulo `os` permite modificar variáveis de ambiente dentro do processo Python atual:
import os # Modifica uma variável de ambiente existente ou cria uma nova os.environ['MY_VARIABLE'] = 'novo_valor'
Em Python, você pode utilizar o módulo `subprocess` para criar subprocessos a partir do seu script Python, o que é útil para executar programas do sistema a partir do Python.
No exemplo abaixo, modificamos a variável de ambiente `PATH` acessando o dicionário `os.environ`. Em seguida, executamos o comando `echo $PATH` como um subprocesso:
import os import subprocess # Define uma variável de ambiente customizada para o subprocesso os.environ['PATH'] = '/caminho/customizado' # Executa um subprocesso que acessa a variável de ambiente PATH result = subprocess.run("echo $PATH", shell=True, stdout=subprocess.PIPE) output = result.stdout.decode() print(output) print(f'Saída do subprocesso: {output}')
Vemos que o `PATH` assume o valor `/caminho/customizado`:
# Saída /caminho/customizado
Escopo das Variáveis de Ambiente Modificadas
É crucial observar que as atualizações de variáveis de ambiente são temporárias e válidas apenas para o processo Python atual. Assim que o script finalizar, as alterações serão descartadas:
- Processo Python Atual: Quando se modifica uma variável de ambiente usando `os.environ` em um script Python, a mudança é local para o processo Python em execução. Isso não afeta outros processos ou futuras sessões do Python.
- Processos Filhos: As alterações nas variáveis de ambiente realizadas no processo Python atual são herdadas pelos processos filhos criados pelo script. Por exemplo, ao gerar um subprocesso a partir do seu script Python (processo pai), o processo filho terá acesso às variáveis de ambiente modificadas (conforme demonstrado no exemplo).
- Não em Todo o Sistema: Variáveis de ambiente definidas em um script Python não persistem fora da execução desse script.
Para efetuar mudanças persistentes nas variáveis de ambiente em nível de sistema, é necessário realizar isso por meio de métodos específicos do sistema operacional.
Como Carregar Arquivos `.env` com `python-dotenv`
A biblioteca `python-dotenv` é um pacote popular em Python que simplifica o carregamento de variáveis de ambiente a partir de um arquivo `.env` em seu projeto. Ela é particularmente útil em cenários com múltiplos ambientes (desenvolvimento, produção, por exemplo) que possuem configurações distintas, permitindo manter essas configurações separadas do código-fonte.
Instalando `python-dotenv`
Para utilizar `python-dotenv`, é necessário instalá-lo. Isso pode ser feito dentro de um ambiente virtual através do gerenciador de pacotes `pip`:
pip install python-dotenv
Carregando Variáveis de Ambiente de um Arquivo `.env`
Agora, você pode criar um arquivo `.env` no diretório raiz do seu projeto e preenchê-lo com pares de chave-valor, de maneira similar às variáveis de ambiente normais. Vamos criar o seguinte arquivo `.env` com valores de exemplo:
API_KEY=sua_chave_api_aqui DB_PASSWORD=sua_senha_banco_de_dados_aqui
Para carregar as variáveis de ambiente do arquivo `.env` utilizando `python-dotenv`, faça da seguinte forma:
import os from dotenv import load_dotenv # Carrega as variáveis de ambiente do arquivo .env load_dotenv() # Acessa as variáveis de ambiente api_key = os.getenv("API_KEY") database_password = os.getenv("DB_PASSWORD") # Exibe as variáveis de ambiente print(f"Chave API: {api_key}") print(f"Senha do Banco de Dados: {database_password}")
Observe que usamos `os.getenv(VARIABLE_NAME)` para obter os valores das variáveis de ambiente. Essa é outra forma válida (e menos comum) de acessar variáveis de ambiente.
O resultado seria:
Chave API: sua_chave_api_aqui Senha do Banco de Dados: sua_senha_banco_de_dados_aqui
Neste exemplo:
- Utilizamos `load_dotenv()` para carregar as variáveis de ambiente definidas no arquivo `.env` no ambiente atual.
- Em seguida, usamos `os.getenv()` para acessar as variáveis de ambiente: `API_KEY` e `DB_PASSWORD`.
Conclusão
E chegamos ao fim! Espero que tenha aprendido como gerenciar configurações e informações confidenciais utilizando variáveis de ambiente em aplicações Python. Abordamos os conceitos básicos de configuração e acesso a variáveis de ambiente, bem como sua aplicação prática na configuração de aplicações.
Embora as variáveis de ambiente sejam certamente úteis para separar a configuração do código-fonte, variáveis confidenciais devem ser armazenadas como segredos em casos de uso de produção. Para gerenciar segredos, recomendo explorar ferramentas como HashiCorp Vault ou AWS Secrets Manager.