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

python dev.to

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.exe del 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])
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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.exe de 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

⚠️ Importante: Usa siempre la misma versión de Python para crear el entorno. Si usas py -3.10 o py -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
Enter fullscreen mode Exit fullscreen mode

É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
Enter fullscreen mode Exit fullscreen mode

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 pip en lugar de pip en scripts y CI/CD. Es más robusto y evita el uso de launchers.
  • Preferiblemente usa py -3.10 -m venv venv en lugar de python -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.exe no 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".

Source: dev.to

arrow_back Back to Tutorials