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
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)
Ejecútalo desde CMD (sin activar el entorno):
python inspect_pip.py "C:\ruta\completa\al\proyecto\venv\Scripts\pip.exe"
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
- Asegúrate de que no estés dentro del entorno virtual (
deactivatesi es necesario). - Ejecuta:
python -m venv --clear "C:\ruta\completa\al\proyecto\venv"
⚠️
--clearfuerza 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
Esto regenera
pip.exe,easy_install.exe, etc., usando lapython.exeactual del entorno.
✅ Paso 4: Verifica permisos reales (si el error persiste)
Ejecuta en CMD:
icacls "C:\ruta\completa\al\proyecto\venv\Scripts\pip.exe"
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
🔍 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
✅ 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.exeestá hardcoded. - Usa
python -m pipen lugar depip.exedirectamente. 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.exeexiste. Usa siemprepython -m pip.
💡 Bonus: Si trabajas con WSL o Git Bash, ejecuta
winpty python -m pippara evitar problemas de terminal.
Top comments (0)