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.
últimas postagens
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.
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.
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.
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.