Programa
As variáveis de ambiente são mecanismos poderosos para armazenar detalhes de configuração do seu projeto de desenvolvimento de forma flexível e segura. Eles armazenam pares de valores-chave de dados acessíveis por linguagens de programação como Python e mantêm essas informações ocultas de olhos curiosos. Neste tutorial, você aprenderá conceitos e técnicas essenciais para criar e gerenciar variáveis de ambiente em Python.
O que são variáveis de ambiente?
As variáveis de ambiente são pares nome-valor armazenados em algum lugar seguro em seu sistema operacional. Na maioria das vezes, eles têm a seguinte aparência:
API_KEY=1akn4nka-aqwej3
Em Python, você pode usar essas variáveis para armazenar informações confidenciais relacionadas ao seu projeto de desenvolvimento. As informações confidenciais podem ser:
- Chaves de API para acessar aplicativos de terceiros
- Nome de usuário e senhas para fazer login em aplicativos por meio de scripts
- Credenciais do banco de dados
- qualquer coisa que possa causar um problema de segurança se for exposta acidentalmente.
Por exemplo, se você escrever um script Python que usa abertamente suas credenciais da AWS e acidentalmente enviar esse script para o GitHub, há uma chance de que partes mal-intencionadas o descubram e aumentem significativamente sua conta da AWS (sabe-se que isso acontece).
Outro benefício das variáveis de ambiente é a capacidade de configuração. Você pode ajustar facilmente as configurações (URLs de banco de dados, caminhos de arquivos) modificando as variáveis de ambiente sem alterar o código. Esse recurso é especialmente útil se você usar a mesma configuração em várias partes do seu projeto.
Então, vamos aprender como você pode trabalhar com eles em Python.
Como recuperar variáveis de ambiente no módulo os do Python
Para recuperar as variáveis de ambiente existentes no seu sistema, você pode usar o módulo os
. Ele tem a função .getenv
para recuperar variáveis:
import os
os.getenv("USER")
'bexgboost'
Acima, estou recuperando o nome de usuário do sistema, que está incorporado em todos os sistemas. Há muitos outros, como o caminho de casa:
os.getenv("HOME")
'/home/bexgboost'
Ou o caminho para o executável do Conda:
os.getenv("CONDA_EXE")
'/home/bexgboost/anaconda3/bin/conda'
Portanto, quando você executa os comandos conda
, é assim que o terminal sabe qual aplicativo deve ser executado.
Mas o que acontece se você tentar recuperar uma variável que não existe?
os.getenv("MYDATABASE")
A função .getenv()
não retorna nada, mas podemos mudar esse comportamento. Você pode usar seu parâmetro default
para retornar um valor personalizado se uma variável não existir:
os.getenv("COMPUTER_PASSWORD", default="Nope!")
'Nope!'
A função .getenv(
) é o melhor método para recuperar as variáveis existentes.
No entanto, em outras fontes, você poderá ver métodos diferentes, como o atributo .environ, que retorna um dicionário contendo todas as variáveis de ambiente:
current_directory = os.environ.get("PWD", None)
current_directory
'/home/bexgboost/articles/2024/4_april'
Como se trata de um dicionário, você pode usar a notação de colchetes (não recomendada) ou a função .get()
para recuperar um valor.
os
também tem acesso à variável de sistema mais importante, chamada PATH. PATH
contém os caminhos absolutos para todos os executáveis instalados no sistema, portanto, é bastante longo:
os.getenv("PATH")[:46]
'/home/bexgboost/.local/bin:/home/bexgboost/bin'
Cada caminho em PATH
é separado por dois pontos. Vamos contar a duração do PATH
em meu sistema:
def count_path_items():
items = os.getenv("PATH").split(":")
return len(items)
count_path_items()
79
79! Nada mal.
Usando a biblioteca python-dotenv para gerenciar as variáveis de ambiente em Python de forma eficaz
Configuração de variáveis de ambiente personalizadas
Agora que sabemos como extrair variáveis existentes, vamos ver como definir variáveis personalizadas. O primeiro método é usar o dicionário os.environ
:
# Create a new environment variable
os.environ["NEW_VARIABLE"] = "42" # Always expects a string value
os.getenv("NEW_VARIABLE")
'42'
No entanto, esse método não é muito útil, pois todas as novas variáveis serão perdidas quando a sessão atual terminar.
Felizmente, há um método mais duradouro de armazenar variáveis de ambiente usando arquivos .env
(pronuncia-se dot-env). Esses arquivos têm a mesma sintaxe, o que significa que funcionarão em qualquer sistema operacional. Aqui está um exemplo de arquivo .env:
CUSTOM_API_LINK=https://myapi.com/v1/api
SNOWFLAKE_USERNAME=bexgboost
MYSQL_DATABASE_PASSWORD=as3ndf03
Por enquanto, ele define apenas três variáveis. Para ler esse arquivo e extrair seu conteúdo, usaremos uma biblioteca chamada python-dotenv
:
$ pip install python-dotenv
Em seguida, em um script Python ou em um Jupyter Notebook, importaremos sua função load_dotenv
e a chamaremos:
from dotenv import load_dotenv
load_dotenv()
True
Se você não conseguir encontrar um arquivo .env
no diretório atual, ele pesquisará todos os diretórios pai e retornará True se o encontrar.
Armazenei o arquivo .env
acima em meu diretório pessoal ~/.env
; é por isso que o load_dotenv
pode encontrá-lo.
Para criar seus próprios arquivos, você pode usar o comando touch
no terminal ou usar um editor de texto como o VSCode:
$ touch ~/.env
A sintaxe dos arquivos .env
é bastante flexível. Por exemplo, você pode definir variáveis com valores de várias linhas (devem ter aspas):
LONG_ENV="This is an environment
variable with a long message"
Use caracteres de escape:
LONG_ENV="This value uses an \"escape character"
Você também pode adicionar comentários ao arquivo para referência futura:
# You can also add comments anywhere with a hashtag
CUSTOM_API_LINK=https://myapi.com/v1/api
SNOWFLAKE_USERNAME=bexgboost
MYSQL_DATABASE_PASSWORD=as3ndf03
Também é possível usar o valor de uma variável dentro de outra usando a sintaxe ${VAR_NAME}
:
FIRST_NAME=John
LAST_NAME=Doe
FULL_NAME="I am ${FIRST_NAME} ${LAST_NAME}"
Recuperação de variáveis de ambiente personalizadas com python-dotenv
A recuperação de variáveis personalizadas é a mesma de antes - basta usar o módulo os
:
import os
os.getenv("CUSTOM_API_LINK")
'https://myapi.com/v1/api'
os.getenv("SNOWFLAKE_USERNAME")
'bexgboost'
Certifique-se de que você ligue primeiro para load_dotenv
.
Se o arquivo .env
estiver localizado em algum lugar inacessível para load_dotenv
, você poderá passar um caminho direto para ele, como abaixo:
load_dotenv("/home/bexgboost/somewhere/unreachable/.env")
True
Trabalhando com arquivos .env no Jupyter
Depois de instalar o Python-dotenv
, você não precisará importá-lo para o Python se estiver usando o Jupyter. A biblioteca vem com um método mágico do Jupyter que a carrega automaticamente:
# Run this anywhere in the notebook to load EVs from .env
%load_ext dotenv
%dotenv
Em seguida, você pode usar o módulo os
novamente:
import os
os.getenv("SNOWFLAKE_USERNAME")
'bexgboost'
Práticas recomendadas para o uso de variáveis de ambiente em Python
Nesta seção, listaremos algumas práticas recomendadas para garantir que as variáveis de ambiente permaneçam seguras e totalmente utilizáveis.
1. Sempre adicione os arquivos .env
a .gitignore
para que você não os envie acidentalmente para o GitHub.
# Create .gitignore if it doesn't exist
$ touch .gitignore
$ echo ".env" >> .gitignore
2. Ao definir variáveis, use nomes descritivos, todos em MAIÚSCULAS.
# Good
DEBUG=True
LOGGING_VERBOSITY=3
# Bad
debug=True
LV=3
3. Crie um único arquivo .env para armazenar variáveis de todo o sistema que você precisa em todos os projetos.
$ touch ~/.env
4. Controle o escopo dos seus arquivos .env. Crie arquivos separados para diferentes partes do seu fluxo de trabalho de desenvolvimento, como abaixo:
$ touch development/.env.development
$ touch testing/.env.testing
$ touch production/.env.production
A função load_dotenv
os reconhecerá.
Se você criar vários arquivos .env
com nomes diferentes, altere o arquivo .gitignore
para que todos eles sejam excluídos da indexação do git:
# Pay attention to the asterisk *
$ echo ".env*" >> .gitignore
Conclusão
Neste artigo, aprendemos todos os conceitos e técnicas essenciais para que você gerencie efetivamente as variáveis de ambiente em Python. Descobrimos como recuperar variáveis existentes com o módulo Python OS e como criar valores personalizados com a biblioteca python-dotenv
. Também aprendemos a escrever arquivos .env
que estejam em conformidade com as práticas recomendadas.
Se você quiser saber mais sobre engenharia de software Python, confira nosso curso, Princípios de engenharia de software em Python.
Você também pode conferir o nosso programa Python Programming Skill Track, que o levará de iniciante a um Pythonista avançado com exercícios práticos e projetos.