DEV Community

Erick Eduardo Ramos
Erick Eduardo Ramos

Posted on

Cómo solucionar el error de permiso al acceder a `pip.exe` en un entorno virtual (Python 3.10 en Windows)

Cómo solucionar el error de permiso al acceder a pip.exe en un entorno virtual (Python 3.10 en Windows)

Explicación técnica

El problema no es un error de permisos de archivo tradicional (como se descartó con icacls). El pip.exe en entornos virtuales de Windows es un launcher empaquetado (un ZIP autoextraíble) que contiene una ruta codificada a python.exe y el script __main__.py de pip. Cuando este launcher se ejecuta, busca la ruta interna a python.exe y la usa para invocar pip.

Causa raíz:

Tras múltiples instalaciones/desinstalaciones de distintas versiones de Python (desde web oficial y Microsoft Store), el pip.exe del entorno virtual conserva una ruta rota a python.exe. Esta ruta puede apuntar a una versión desinstalada, a una ubicación inaccesible (por ejemplo, a una cuenta de Microsoft Store no válida), o a una ruta con caracteres no válidos o codificación incorrecta.

Cuando ejecutas pip install, el launcher intenta invocar la ruta codificada internamente, falla con "Access is denied" (no porque falten permisos, sino porque el binario no se puede ejecutar desde esa ruta), y el error se propaga como un permission error.

Pasos para solucionarlo

Paso 1: Verifica la ruta codificada en pip.exe

Crea un script check_pip_launcher.py con el siguiente contenido:

import sys
try:
    with open(sys.argv[1], 'rb') as f:
        data = f.read()[-4096:]
        i = data.rfind(b'PK\x05\x06')
        if i == -1:
            print("ERROR: No ZIP end-of-central-directory signature found.")
            sys.exit(1)
        i0 = data.rfind(b'#!', 0, i) + 2
        i1 = data.find(b'\n', i0)
        if i0 == 1 or i1 == -1:
            print("ERROR: No shebang ('#!') found in launcher.")
            sys.exit(1)
        path = data[i0:i1].strip(b'"').decode('utf-8', errors='replace')
        print(f"Embedded python.exe path: {path}")
except Exception as e:
    print(f"ERROR reading launcher: {e}")
Enter fullscreen mode Exit fullscreen mode

Ejecútalo desde CMD (no desde 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:

Una ruta válida como C:\Users\<username>\AppData\Local\Programs\Python\Python310\python.exe

Resultado problemático:

  • Ruta a una versión desinstalada
  • Ruta a C:\Program Files\WindowsApps\... (Microsoft Store) que ya no existe
  • Ruta vacía o con caracteres extraños

Paso 2: Recrea el pip.exe del entorno virtual

No copies pip.exe manualmente. El launcher es específico de la versión de Python y debe regenerarse.

Opción A (recomendada): Elimina y recrea el entorno virtual

rmdir /s /q "C:\Users\<username>\<project dir>\venv"
python -m venv "C:\Users\<username>\<project dir>\venv"
"C:\Users\<username>\<project dir>\venv\Scripts\activate"
pip install -e .
Enter fullscreen mode Exit fullscreen mode

Opción B (si no puedes borrar el entorno): Reinstala pip dentro del entorno

  1. Activa el entorno:
   "C:\Users\<username>\<project dir>\venv\Scripts\activate"
Enter fullscreen mode Exit fullscreen mode
  1. Elimina el pip.exe roto:
   del "Scripts\pip.exe"
   del "Scripts\pip*.exe"
Enter fullscreen mode Exit fullscreen mode
  1. Regenera pip usando ensurepip:
   python -m ensurepip --upgrade
Enter fullscreen mode Exit fullscreen mode
  1. Verifica que funcione:
   pip --version
Enter fullscreen mode Exit fullscreen mode

Paso 3: Verifica que el launcher ahora apunte a la versión correcta

Repite el paso 1 para confirmar que la ruta interna ahora es válida y apunta a la versión instalada de Python 3.10.


Bloque de código corregido (comando final)

:: Desde CMD (NO bash), sin activar el entorno:
cd /d "C:\Users\<username>\<project dir>"
rmdir /s /q venv
python -m venv venv
call venv\Scripts\activate.bat
pip install -e .
Enter fullscreen mode Exit fullscreen mode

Nota crítica: Usa call si ejecutas activate.bat desde un script .bat. En línea de comandos directa, activate basta.


Pro-tip: Evita este problema en el futuro

  • Nunca mezcles instalaciones de Python de la web oficial y Microsoft Store. Son incompatibles a nivel de rutas y permisos.
  • Si usas múltiples versiones, usa py -3.10 -m venv venv en lugar de python -m venv venv para evitar ambigüedad.
  • Para entornos críticos, usa venv con la bandera --copies (evita enlaces simbólicos problemáticos en entornos corporativos con políticas de seguridad):
  python -m venv venv --copies
Enter fullscreen mode Exit fullscreen mode

🔍 Dato oculto: El error "Access is denied" en pip.exe suele ser un falso positivo de permisos. El verdadero problema es que el launcher intenta ejecutar un python.exe que ya no existe o no es accesible — no se trata de permisos de archivo, sino de rutas rotas en el launcher.

Top comments (0)