DEV Community

Erick Eduardo Ramos
Erick Eduardo Ramos

Posted on

Cómo solucionar el error de permisos al ejecutar `pip.exe` en entornos virtuales de Python en Windows

Cómo solucionar el error de permisos al ejecutar pip.exe en entornos virtuales de Python en Windows

Explicación técnica

El error "Access is denied" al ejecutar pip.exe desde un entorno virtual en Windows ocurre porque el launcher pip.exe (un pequeño ejecutable empaquetado como ZIP con un script interno) contiene una ruta hardcoded a python.exe en el momento de su creación. Si esa ruta se vuelve inválida —por ejemplo, al cambiar de versión de Python, reinstalar, o mover el entorno— el launcher intenta ejecutar una python.exe que ya no existe o no es accesible, causando el error de permisos.

Este comportamiento es conocido y documentado por desarrolladores de Python como Eryk Sun: el launcher pip.exe no recalcula dinámicamente la ruta a python.exe, sino que la almacena internamente al crear el entorno.

⚠️ Nota crítica: Aunque los permisos del archivo (icacls) sean correctos, el problema no es de ACLs, sino de ruta rota embebida dentro del launcher ZIP.


Pasos para solucionar el problema

✅ Paso 1: Verifica si el launcher está roto (sin activar el entorno)

Abre CMD (no PowerShell ni bash) y ejecuta:

"C:\ruta\completa\al\proyecto\venv\Scripts\pip.exe" -V
Enter fullscreen mode Exit fullscreen mode

Si obtienes Access is denied. sin el prefijo Fatal error in launcher:, el problema es de permisos reales (ver paso 4).

Si obtienes Fatal error in launcher: Unable to create process using "C:\...python.exe": Access is denied., el problema es la ruta embebida.

✅ Paso 2: Recupera la ruta de python.exe embebida en pip.exe

Crea un script inspect_pip.py con este contenido:

import sys
with open(sys.argv[1], 'rb') as f:
    data = f.read()[-4096:]
    i = data.rfind(b'PK\x05\x06')
    i0 = data.rfind(b'#!', 0, i) + 2
    i1 = data.find(b'\n', i0)
    path = data[i0:i1].strip(b'"').decode()
    print(path)
Enter fullscreen mode Exit fullscreen mode

Ejecútalo desde CMD (sin activar el entorno):

python inspect_pip.py "C:\ruta\completa\al\proyecto\venv\Scripts\pip.exe"
Enter fullscreen mode Exit fullscreen mode

Si el resultado es una ruta inválida (ej. C:\Python39\python.exe cuando instalaste Python 3.10), el launcher está roto.

✅ Paso 3: Regenera pip.exe correctamente

Opción A (recomendada): Reinstala pip usando python -m pip

  1. Asegúrate de que no estés dentro del entorno virtual (deactivate si es necesario).
  2. Ejecuta:
python -m venv --clear "C:\ruta\completa\al\proyecto\venv"
Enter fullscreen mode Exit fullscreen mode

⚠️ --clear fuerza la recreación de todos los archivos del entorno, incluyendo los launchers corregidos.

O alternativamente, si prefieres conservar paquetes instalados (menos recomendado):

python -m pip install --force-reinstall --no-deps pip setuptools wheel
Enter fullscreen mode Exit fullscreen mode

Esto regenera pip.exe, easy_install.exe, etc., usando la python.exe actual del entorno.

✅ Paso 4: Verifica permisos reales (si el error persiste)

Ejecuta en CMD:

icacls "C:\ruta\completa\al\proyecto\venv\Scripts\pip.exe"
Enter fullscreen mode Exit fullscreen mode

Si el usuario actual no tiene F (Full Control) o RX (Read & Execute), otorga permisos:

icacls "C:\ruta\completa\al\proyecto\venv\Scripts\pip.exe" /grant %USERNAME%:F
Enter fullscreen mode Exit fullscreen mode

🔍 Nota: En entornos corporativos con políticas de grupo, los permisos pueden ser sobrescritos automáticamente. Si el problema reaparece tras reiniciar, revisa si hay software de endpoint protection (antivirus, EDR) bloqueando ejecución.


Bloque de código corregido (solución definitiva)

:: Desactiva entorno si está activo
deactivate 2>nul

:: Limpia y recrea el entorno (recomendado)
python -m venv --clear "C:\Users\%USERNAME%\projects\mi-proyecto\venv"

:: Opcional: Si no quieres borrar el entorno, reinstala pip
:: python -m pip install --force-reinstall --no-deps pip setuptools wheel

:: Verifica que pip.exe funcione
"C:\Users\%USERNAME%\projects\mi-proyecto\venv\Scripts\pip.exe" --version
Enter fullscreen mode Exit fullscreen mode

Resultado esperado:

pip 23.x.x from C:\...\venv\lib\site-packages\pip (python 3.10)


Pro-tip: Evita este problema en el futuro

  • Nunca muevas o renombres directorios de entornos virtuales. La ruta a python.exe está hardcoded.
  • Usa python -m pip en lugar de pip.exe directamente. Es más robusto y evita problemas con launchers corruptos.
  • Si usas múltiples versiones de Python, instálalas desde el instalador oficial (no Microsoft Store), y evita mezclar instalaciones.
  • En scripts de CI/CD o automatización, nunca asumas que pip.exe existe. Usa siempre python -m pip.

💡 Bonus: Si trabajas con WSL o Git Bash, ejecuta winpty python -m pip para evitar problemas de terminal.

Top comments (0)