HOWTO · Python
Leer variables de entorno del archivo Env en Python
Aprende a cargar valores locales de .env en Python con python-dotenv o a leerlos y exportarlos desde un shell antes de iniciar un script.
En esta página
Un archivo .env almacena valores de configuración, como la URL de un servicio o un indicador de modo de desarrollo. Python no carga ese archivo automáticamente. Para una aplicación, la opción directa es python-dotenv; un script de shell resulta útil cuando quieres cargar y exportar valores antes de iniciar un proceso de Python.
Leer un archivo .env en Python con python-dotenv
Para una aplicación, instala python-dotenv en el mismo entorno de Python que se utiliza para ejecutarla con python -m pip install python-dotenv. El ejemplo siguiente crea un archivo .env temporal que contiene APP_MODE=development y pasa esa ruta exacta del archivo a load_dotenv() antes de recuperar el valor con os.getenv(). En tu aplicación, pasa la ruta del archivo .env de tu proyecto a load_dotenv(); cuando se encuentra junto al script, puedes usar Path(__file__).with_name(".env"):
import os
from pathlib import Path
from tempfile import TemporaryDirectory
try:
from dotenv import load_dotenv
except ImportError:
print("Install python-dotenv to run this example.")
else:
with TemporaryDirectory() as directory:
env_path = Path(directory) / ".env"
env_path.write_text("APP_MODE=development\n", encoding="utf-8")
load_dotenv(env_path)
print(os.getenv("APP_MODE"))
La evidencia de ejecución confirma que el caso de carga correcta imprimió development. La evidencia de ejecución proporcionada también registra el comportamiento alternativo por falta de la dependencia, que imprimió “Install python-dotenv to run this example.” El ejemplo carga el archivo temporal creado en el código, en lugar de un archivo del proyecto. De forma predeterminada, load_dotenv() conserva un valor de APP_MODE que ya está presente en el entorno del proceso, por lo que development solo se imprime cuando esa variable no estaba ya definida. Para una aplicación, pasa la ruta del archivo del proyecto de forma explícita, como se muestra arriba. Consulta la guía de python-dotenv para obtener detalles sobre el uso del paquete.
El siguiente ejemplo independiente, basado únicamente en la biblioteca estándar, es una alternativa separada para leer un archivo sencillo de tipo KEY=value sin un paquete instalado:
import os
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as directory:
env_path = Path(directory) / ".env"
env_path.write_text("APP_MODE=development\n", encoding="utf-8")
for line in env_path.read_text(encoding="utf-8").splitlines():
key, separator, value = line.partition("=")
if separator:
os.environ[key] = value
print(os.getenv("APP_MODE"))
development
Este pequeño analizador solo sirve para líneas sencillas de tipo KEY=value; utiliza python-dotenv cuando necesites su comportamiento de análisis de .env. En una aplicación, pasa una ruta como dotenv_path=Path(__file__).with_name(".env") a load_dotenv() cuando el archivo deba estar junto a tu script. Mantén los secretos fuera del control de versiones y restringe el acceso a los archivos que contengan credenciales.
Cargar un archivo .env antes de ejecutar Python
Un shell también puede cargar valores y pasarlos a un proceso hijo de Python. Esto es independiente de activar un entorno virtual de Python: cargar con source modifica las variables del shell, mientras que un entorno virtual selecciona Python y los paquetes instalados.
El siguiente ejemplo de Bash crea sus propios archivos, carga la configuración con source, exporta los valores para el proceso hijo y ejecuta Python:
set -eu
workdir=$(mktemp -d)
trap 'rm -rf "$workdir"' EXIT
cat > "$workdir/config.env" <<'ENV'
TYPE=prod
PORT=5000
ENV
cat > "$workdir/read_env.py" <<'PY'
import os
print(os.getenv("TYPE"))
print(os.getenv("PORT"))
PY
(
cd "$workdir"
set -a
. ./config.env
set +a
python3 read_env.py
)
prod
5000
Aquí, set -a marca las asignaciones para su exportación, . (la forma POSIX de source en Bash) lee el archivo en el shell actual y set +a desactiva de nuevo la exportación automática. Cargar con source ejecuta la sintaxis del shell, así que carga solo archivos en los que confíes. Un archivo .env destinado a python-dotenv puede contener una sintaxis que no sea válida en un shell; mantén la configuración del shell sencilla y compatible con el shell que utilices.
Si falta un valor, comprueba que la ruta apunte al archivo previsto, que la ortografía de la clave coincida en ambos lugares y que el archivo se cargue antes de que se inicie Python. El hecho de que un archivo esté junto a un script no coloca por sí solo sus valores en el entorno del proceso.
Ejecutar el script de shell en Windows
En Windows, ejecuta el flujo de Bash a través de WSL o Git Bash. WSL proporciona una distribución de Linux como Ubuntu; Git Bash está disponible en la página de descargas de Git. En WSL, usa cd para entrar en el directorio que contiene run.sh; en Git Bash, elige Git Bash Here en ese directorio o usa cd. A continuación, ejecuta ./run.sh. El script crea config.env y read_env.py en un directorio temporal y los elimina al salir, por lo que no necesitas colocar esos archivos junto a run.sh.
Guarda run.sh con finales de línea de Unix (LF) para que Bash pueda leerlo como se espera.
Conclusión
Utiliza python-dotenv para cargar un archivo .env local dentro de una aplicación de Python, o utiliza Bash para cargar con source y exportar valores compatibles con el shell antes de iniciar Python. Comprueba primero la ruta del archivo y los nombres de las variables cuando un valor no esté disponible, y recuerda que cargar con source ejecuta el archivo como código de shell.