Cómo solucionar el error de permisos con 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 no suele deberse a permisos de archivo reales (como se descartó con icacls), sino a un problema en el launcher empaquetado dentro de pip.exe. Este archivo .exe es un stub que contiene incrustado:
- La ruta absoluta al
python.exedel entorno virtual - El código de
pip.__main__(como un ZIP embebido)
Cuando se crea el entorno virtual, si el python.exe usado para crearlo tenía una ruta incompleta, corrompida, o apuntaba a un binario que ya no existe o no tiene permisos de ejecución, el launcher quedaría roto. Esto es especialmente común tras:
- Mover o reinstalar Python
- Usar múltiples instalaciones (Microsoft Store vs python.org)
- Cambiar de versión de Python sin recrear el entorno virtual
- Permisos de ejecución restringidos por políticas de grupo (aunque menos frecuente en entornos de usuario)
El hecho de que python -m pip funcione correctamente confirma que el problema es específico del launcher pip.exe, no del entorno virtual ni de los permisos del usuario.
Pasos para solucionarlo
1. Verifica la ruta embebida en pip.exe
Crea un script check_pip_launcher.py con el siguiente contenido:
import sys
def extract_python_path(pip_exe_path):
with open(pip_exe_path, 'rb') as f:
data = f.read()[-4096:] # Últimos 4KB del archivo (donde se embebe la info)
# Buscar el ZIP central directory (PK\x05\x06)
i = data.rfind(b'PK\x05\x06')
if i == -1:
print("ERROR: No se encontró el ZIP incrustado (pip.exe corrupto)")
return
# Buscar el shebang '#!' que precede al ZIP
i0 = data.rfind(b'#!', 0, i) + 2
i1 = data.find(b'\n', i0)
if i0 == 1 or i1 == -1:
print("ERROR: No se encontró la ruta embebida")
return
path = data[i0:i1].strip(b'"').decode('utf-8')
print(f"Ruta embebida en pip.exe: {path}")
return path
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Uso: python check_pip_launcher.py <ruta_a_pip.exe>")
sys.exit(1)
extract_python_path(sys.argv[1])
Ejecútalo desde CMD (no Bash) y sin activar el entorno virtual:
python check_pip_launcher.py "C:\Users\<username>\<project dir>\venv\Scripts\pip.exe"
✅ Resultado esperado:
Ruta embebida en pip.exe: C:\Users\<username>\AppData\Local\Programs\Python\Python310\python.exe
❌ Resultado problemático:
- Ruta a un archivo que ya no existe
- Ruta a
python.exede Microsoft Store (ej.C:\Users\<username>\AppData\Local\Microsoft\WindowsApps\python.exe) - Ruta vacía o corrupta
2. Recrea pip.exe en el entorno virtual
Opción A: Reinstalar pip en el entorno (recomendada)
cd C:\Users\<username>\<project dir>\venv\Scripts
python -m ensurepip --upgrade
python -m pip install --upgrade pip
Esto regenera los launchers (pip.exe, pip3.exe, etc.) usando el python.exe actual del entorno.
Opción B: Eliminar y recrear el entorno virtual (si persiste)
# Desactiva el entorno si está activo
deactivate
# Elimina el entorno
rmdir /s /q "C:\Users\<username>\<project dir>\venv"
# Recréalo con la versión correcta de Python
python -m venv "C:\Users\<username>\<project dir>\venv"
# Actívalo
C:\Users\<username>\<project dir>\venv\Scripts\activate
# Verifica que pip.exe funcione
pip --version
⚠️ Importante: Usa siempre la misma versión de Python para crear el entorno. Si usas
py -3.10opy -3.11, asegúrate de invocar explícitamente la versión deseada.
3. Verificación final
Ejecuta desde CMD (sin Bash):
"C:\Users\<username>\<project dir>\venv\Scripts\pip.exe" --version
✅ Éxito: Mostrará la versión de pip sin errores.
Bloque de código corregido (resumen rápido)
:: 1. Verifica la ruta embebida
python check_pip_launcher.py "C:\path\to\venv\Scripts\pip.exe"
:: 2. Si falla, reinstala pip en el entorno
cd "C:\path\to\venv\Scripts"
python -m ensurepip --upgrade
python -m pip install --upgrade pip
:: 3. Verifica
pip --version
Pro-tip: Evita este problema en el futuro
-
Nunca muevas o renombres el directorio del entorno virtual (
venv/). Si lo haces, recrea el entorno. -
Usa
python -m pipen lugar depipen scripts y CI/CD. Es más robusto y evita el uso de launchers. -
Preferiblemente usa
py -3.10 -m venv venven lugar depython -m venv venv, para evitar ambigüedad entre múltiples instalaciones. - Si usas Microsoft Store Python, desinstálalo y usa la versión oficial de python.org, ya que el Store tiene limitaciones de sandboxing que afectan launchers.
🔍 Nota clave: El problema no es de permisos del archivo, sino de rutas rotas embebidas en el launcher.
pip.exeno es un binario estándar: es un ZIP autoextraíble con una ruta fija al intérprete. Si esa ruta ya no es válida, el launcher fallará con "Access is denied".
Top comments (0)