Cómo configurar PYTHONPATH en Windows, macOS y Linux (Variables de entorno)
PYTHONPATH es una variable de entorno que extiende sys.path (donde Python busca módulos al hacer import). Permite importar paquetes locales sin instalarlos (pip install -e .) ni moverlos a site-packages. Útil para desarrollo, testing, monorepos y scripts.
Windows 11 / 10 / 8 / 7
Método 1: GUI (Interfaz gráfica) - Permanente, usuario o sistema
- Win → busque "Editar las variables de entorno del sistema" / "Edit the system environment variables" → Enter.
- Botón Variables de entorno... (abajo).
- En Variables de usuario (solo su usuario) o Variables del sistema (todos, requiere admin):
Nueva...
Nombre:PYTHONPATH
Valor:C:\ruta\a\su\proyecto;C:\otra\ruta\modulos(separados por punto y coma ;) - Aceptar ×3. Reinicie terminales abiertas para tomar efecto.
Método 2: PowerShell (Temporal / Sesión actual)
$env:PYTHONPATH = "C:\ruta\a\proyecto;C:\otra\ruta"
# Verificar:
python -c "import sys; print('\n'.join(sys.path))"
Para permanente en PowerShell (perfil usuario):
notepad $PROFILE
# Añada línea:
[Environment]::SetEnvironmentVariable("PYTHONPATH", "C:\ruta\a\proyecto;C:\otra\ruta", "User")
Método 3: Command Prompt (cmd) - Temporal
set PYTHONPATH=C:\ruta\a\proyecto;C:\otra\ruta
python -c "import sys; print(sys.path)"
Permanente (usuario): setx PYTHONPATH "C:\ruta\a\proyecto;C:\otra\ruta" (requiere nueva ventana).
macOS / Linux (bash, zsh, fish)
bash (~/.bashrc) / zsh (~/.zshrc) - Permanente, usuario
- Edite archivo:
nano ~/.bashrconano ~/.zshrc. - Añada al final:
Usar : como separador (no ;).export PYTHONPATH="${PYTHONPATH}:/ruta/a/su/proyecto:/otra/ruta/modulos"${PYTHONPATH}preserva valores existentes. source ~/.bashrcosource ~/.zshrc(o reinicie terminal).
fish (~/.config/fish/config.fish)
set -gx PYTHONPATH $PYTHONPATH /ruta/a/su/proyecto /otra/ruta/modulos
Temporal (sesión actual)
export PYTHONPATH="${PYTHONPATH}:/ruta/a/proyecto" # bash/zsh
set -gx PYTHONPATH $PYTHONPATH /ruta/a/proyecto # fish
Verificar que funciona
python -c "import sys; print('PYTHONPATH activo:'); [print(f' {p}') for p in sys.path if 'su_proyecto' in p]"
# O simplemente:
python -c "import su_modulo; print('Import OK:', su_modulo.__file__)"
Buenas prácticas y alternativas modernas (¡Lea esto!)
| Escenario | Recomendación (Mejor que PYTHONPATH) |
|---|---|
| Paquete propio en desarrollo | pip install -e . (editable install) en raíz del proyecto (con pyproject.toml / setup.py). Estándar actual. |
| Proyecto con estructura src/ | pip install -e . + [tool.setuptools.packages.find] en pyproject.toml. |
| Monorepo / Múltiples paquetes locales | pip install -e ./paquete1 -e ./paquete2 o Poetry / PDM (gestores dependencias modernos). |
| Scripts sueltos / Carpeta scripts/ | Añada scripts/ a PATH (no PYTHONPATH). Ejecute como comando: mi_script.py. |
| Notebooks Jupyter / Colab | import sys; sys.path.insert(0, '/ruta/proyecto') al inicio del notebook. O %load_ext autoreload + %autoreload 2. |
| Docker / Contenedores | ENV PYTHONPATH=/app:/app/src en Dockerfile. O WORKDIR /app + pip install -e .. |
| CI/CD (GitHub Actions, GitLab CI) | PYTHONPATH: ${{ github.workspace }}/src en job env. O pip install -e . en step. |
