Variáveis ​​de ambiente Python e como trabalhar com elas

Quer gerenciar melhor sua configuração? Aprenda como trabalhar com variáveis ​​de ambiente em Python.

Quando eu estava aprendendo Python sozinho, construía projetos para aplicar o que acabara de aprender. Um subconjunto deles envolvia conectar-se a um banco de dados e consultá-lo usando Python. O que significava que eu precisava armazenar a configuração do banco de dados e informações confidenciais, como nome de usuário e senha para autenticação.

Codificar essas informações confidenciais em um script Python não era uma boa ideia. E aprendi como usar arquivos de configuração e variáveis ​​de ambiente — junto com os módulos integrados do Python para trabalhar com eles.

Portanto, sempre que preciso usar informações confidenciais, como senhas e chaves de API em meus aplicativos, eu as defino como variáveis ​​de ambiente e as busco conforme necessário. Neste tutorial, mostrarei variáveis ​​de ambiente e como trabalhar com elas em Python.

O que são variáveis ​​de ambiente?

Variáveis ​​de ambiente são variáveis ​​externas ao seu aplicativo que armazenam informações de configuração, configurações do sistema e assim por diante. Eles normalmente são gerenciados pelo sistema operacional ou pelo ambiente do aplicativo. As principais características das variáveis ​​de ambiente incluem:

  • Pares Nome-Valor: As variáveis ​​de ambiente consistem em um nome (também conhecido como chave) e um valor correspondente.
  • Escopo do sistema: você pode definir variáveis ​​de ambiente no nível do sistema, tornando-as acessíveis a todos os processos em execução no sistema. Se necessário, você também pode modificá-los ou defini-los no nível do aplicativo, afetando apenas esse aplicativo específico.
  • Dinâmico e mutável: você pode modificar variáveis ​​de ambiente durante o tempo de execução, proporcionando flexibilidade.

Como as variáveis ​​de ambiente são úteis

As variáveis ​​de ambiente oferecem vários benefícios para gerenciar configurações e informações confidenciais em seus aplicativos Python:

  • Separação de preocupações: ao armazenar a configuração fora do seu código, você mantém as preocupações do gerenciamento de configuração separadas da lógica do seu aplicativo.
  • Segurança: você pode armazenar dados confidenciais, como chaves de API e credenciais de banco de dados, em variáveis ​​de ambiente — sem expô-los no código-fonte — reduzindo o risco de exposição.
  • Flexibilidade: com variáveis ​​de ambiente, atualizar as definições de configuração é simples, pois você pode atualizar/fazer alterações fora da base de código. As variáveis ​​de ambiente permitem ajustar as definições de configuração sem modificar seu código. Essa flexibilidade é especialmente útil para implantar aplicativos em ambientes diferentes ou ao atualizar credenciais.
  Iniciar Parar Continuar Retrospectiva Explicada [With Template Resources]

Nas seções a seguir deste tutorial, exploraremos como definir, acessar e gerenciar variáveis ​​de ambiente em Python e como elas aprimoram o gerenciamento de configuração em seus projetos.

Como definir variáveis ​​de ambiente

Você pode definir variáveis ​​de ambiente usando a linha de comando. O escopo dessas variáveis ​​de ambiente se aplica somente à sessão atual — e elas não persistem fora da sessão atual.

Se você estiver em uma máquina Mac ou Linux, poderá definir uma variável de ambiente em sua sessão de terminal atual da seguinte forma:

export MY_VARIABLE=my_value

Se você for usuário do Windows, poderá definir uma variável de ambiente temporariamente, conforme mostrado:

set MY_VARIABLE=my_value

Acessar variáveis ​​de ambiente em Python

Python fornece o módulo de sistema operacional para funcionalidades relacionadas ao sistema operacional. E os.environ é um dicionário de variáveis ​​de ambiente. Os nomes das variáveis ​​de ambiente e seus valores são as chaves e os valores do dicionário, respectivamente.

Assim, você pode acessar os valores das variáveis ​​de ambiente — usando (seus nomes como) as chaves — da mesma forma que acessaria elementos de um dicionário.

Aqui estão alguns exemplos:

import os
print(os.environ['HOME'])
# Output: /home/balapriya
print(os.environ['USER'])
# Output: balapriya

Até agora tudo bem. Mas o que acontece se você tentar acessar o valor de uma variável de ambiente que nunca foi definida?

Vamos tentar acessar a API_KEY que ainda não definimos:

print(os.environ['API_KEY'])

Como esperado, você receberá um KeyError:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<frozen os>", line 679, in __getitem__
KeyError: 'API_KEY'

Lidando com erros importantes

Você pode lidar com o KeyError conforme mostrado:

import os

try:
	api_key = os.environ['API_KEY']
	print(f'API_KEY is set to: {api_key}')
except KeyError:
	print('API_KEY is not set. Please configure it.')

Essa abordagem não interrompe abruptamente a execução do programa quando uma exceção KeyError é gerada. No entanto, fornece uma mensagem de erro descritiva:

# Output
API_KEY is not set. Please configure it.

Portanto, quando o restante do programa não é executado conforme o esperado, sabemos que deixamos de definir uma variável de ambiente necessária.

Acessando variáveis ​​de ambiente usando o método get()

Você pode usar o método de dicionário get() para obter o valor de uma variável de ambiente. Em vez de KeyError, o método get() retorna None se a variável não for encontrada.

  Todos os códigos de resgate do Counter Blox: Resgate agora

Acessar a variável NOT_SET que não definimos retorna None:

print(os.environ.get('NOT_SET'))
# Output: None

Prefiro gerar um erro de chave quando a variável de ambiente não está definida. Em seguida, deixe-o passar silenciosamente ou ser incluído no None que o método get() retorna.

Mas o método get() é útil quando podemos passar um valor padrão para uma variável de ambiente específica, se ela não estiver definida.

Aqui está um exemplo:

print(os.environ.get('HOME','/home/user'))
# Output: /home/balapriya

Como gerenciar a configuração com variáveis ​​de ambiente

Agora vamos dar alguns exemplos práticos onde usamos variáveis ​​de ambiente em nossa aplicação.

Exemplo 1: configurando parâmetros de conexão com o banco de dados

Digamos que você queira se conectar a um banco de dados PostgreSQL do Python. Para fazer isso, você pode instalar e usar o conector psycopg2:

pip install psycopg2

Neste exemplo, usamos variáveis ​​de ambiente para configurar os parâmetros de conexão do banco de dados. Se as variáveis ​​de ambiente não estiverem definidas, fornecemos valores padrão para uso.

import os
import psycopg2  

# Retrieve database configuration from environment variables
db_host = os.environ.get('DB_HOST', 'localhost')
db_port = os.environ.get('DB_PORT', '5432')
db_user = os.environ.get('DB_USER', 'myuser')
db_password = os.environ.get('DB_PASSWORD', 'mypassword')

# Establish a database connection
try:
	connection = psycopg2.connect(
    	host=db_host,
    	port=db_port,
    	user=db_user,
    	password=db_password,
    	database="mydb"
	)
	print('Connected to the database!')
except Exception as e:
	print(f'Error connecting to the database: {e}')

Exemplo 2: Gerenciando Chaves de API

Vejamos outro exemplo que envolve o uso de chaves de API.

Além da interface ChatGPT, você também pode usar a API OpenAI para oferecer suporte a OpenAI LLMs em seus aplicativos.

Ao se inscrever em uma conta OpenAI, você (normalmente verá) alguns créditos de API gratuitos por tempo limitado. Obtenha sua chave de API navegando até Configurações > Exibir chaves de API.

Você pode usar o Open AI Python SDK e uma estrutura como LangChain para construir aplicativos. Para fazer isso você precisa instalar as bibliotecas (em um ambiente virtual) usando 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"]='your-api-key'

Agora você pode acessar os Open AI LLMs 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

Você pode acessar o dicionário os.environ do módulo os para modificar variáveis ​​de ambiente dentro do processo Python atual:

import os

# Modify an existing environment variable or create a new one
os.environ['MY_VARIABLE'] = 'new_value'

Em Python, você pode usar o módulo de subprocesso para gerar subprocessos de script Python existente. O que é útil quando você deseja executar programas de sistema em Python.

No exemplo a seguir, modificamos a variável de ambiente PATH acessando o dicionário os.environ. Em seguida, executamos echo $PATH como um subprocesso:

import os
import subprocess

# Set a custom environment variable for the subprocess
os.environ['PATH'] = '/custom/path'

# Run a subprocess that accesses the PATH environment variable
result = subprocess.run("echo $PATH", shell=True, stdout=subprocess.PIPE)
output = result.stdout.decode()
print(output)
print(f'Subprocess output: {output}')

Vemos que o PATH assume o valor de /custom/path:

# Output
/custom/path

Escopo das Variáveis ​​de Ambiente Modificadas

É importante observar que essas atualizações de variáveis ​​de ambiente são temporárias e válidas apenas para o processo Python atual. Assim que o script terminar, as alterações serão descartadas:

  • Processo Python atual: quando você modifica uma variável de ambiente usando os.environ em seu script Python, a alteração é local para o processo Python atual. Isso não afetará outros processos em execução ou sessões futuras do Python.
  • Processos filhos: as alterações nas variáveis ​​de ambiente feitas no processo Python atual são herdadas pelos processos filhos criados pelo seu script. Por exemplo, se você gerar um subprocesso do seu script Python (processo pai), o processo filho terá acesso às variáveis ​​de ambiente modificadas (como visto no exemplo).
  • Não em todo o sistema: as variáveis ​​de ambiente definidas em um script Python não persistirão fora da execução desse script.
  6 Melhor Hospedagem de Servidor Factorio para Todos

Se precisar fazer alterações persistentes nas variáveis ​​de ambiente no nível do sistema, normalmente você precisará fazer isso usando métodos específicos do sistema operacional.

Como carregar arquivos .env com python-dotenv

O biblioteca python-dotenv é um pacote Python popular que simplifica o processo de carregamento de variáveis ​​de ambiente de um arquivo .env em seu projeto Python. É particularmente útil quando você tem vários ambientes (por exemplo, desenvolvimento, produção) com configurações diferentes e deseja manter essas configurações separadas do seu código-fonte.

Instalando python-dotenv

Para usar python-dotenv, você precisa instalá-lo primeiro. Você pode instalá-lo – dentro de um ambiente virtual – usando pip, o gerenciador de pacotes Python:

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 valores-chave, assim como variáveis ​​de ambiente normais. Vamos criar o seguinte arquivo .env com valores de espaço reservado:

API_KEY=your_api_key_here
DB_PASSWORD=your_database_password_here

Agora você pode carregar as variáveis ​​de ambiente do arquivo .env usando python-dotenv assim:

import os
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()

# Access the environment variables
api_key = os.getenv("API_KEY")
database_password = os.getenv("DB_PASSWORD")

# Print out the env variables
print(f"API Key: {api_key}")
print(f"Database Password: {database_password}")

Observe que usamos os.getenv(VARIABLE_NAME) para obter os valores das variáveis ​​de ambiente. Esta também é uma forma válida (e menos usada) de acessar variáveis ​​de ambiente.

Aqui está o resultado:

API Key: your-api-key-here
Database Password: your-database-url-here

Neste exemplo:

  • Usamos 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 isso é um embrulho! Espero que você tenha aprendido como gerenciar configurações e informações confidenciais usando variáveis ​​de ambiente em aplicativos Python. Abordamos os conceitos básicos de configuração e acesso a variáveis ​​de ambiente, bem como seu uso prático na configuração de aplicativos.

Embora as variáveis ​​de ambiente sejam certamente úteis para separar a configuração do código-fonte, você deve armazenar variáveis ​​confidenciais como segredos em casos de uso de produção. Para gerenciar segredos, recomendo explorar ferramentas como Cofre HashiCorp ou Gerenciador de segredos da AWS.