HOWTO · Python
Cómo solucionar el error de Python: no se puede abrir 'setup.py': [Errno 2] El archivo o el directorio no existe
Aprenderemos, con esta explicación, cómo solucionar el error File not found o No such file or directory en Python.
En esta página
El mensaje python: can't open file 'setup.py': [Errno 2] No such file or directory significa que Python no encontró la ruta del script indicada en el comando. Primero comprueba qué ruta intenta abrir el comando: puede que setup.py no esté en el directorio de trabajo actual, tenga otro nombre o se encuentre en otra ubicación. Esto es distinto de FileNotFoundError, que un script genera después de iniciarse cuando el código intenta abrir otro archivo que no existe.
Identifica qué archivo no encuentra Python
Lee el mensaje de error completo junto con el comando. Si indica que Python no puede abrir setup.py, el intérprete no llegó a iniciar ese script; revisa el argumento del comando que señala el script y el directorio desde el que lo ejecutaste. Si un traceback señala una línea dentro del programa y muestra FileNotFoundError, el script sí se inició y debes investigar el código que abre el archivo. En ese caso, la ruta que falta podría ser la de un archivo de datos, de configuración u otro recurso, en lugar de setup.py.
Esta distinción determina qué debes comprobar a continuación. Un comando como python setup.py install pide a Python que encuentre un script llamado setup.py. En cambio, si app.py se inicia correctamente pero luego falla al ejecutar open("records.csv"), el archivo que intenta encontrar es records.csv. No vuelvas a crear un archivo del proyecto sin confirmar antes que el comando deba utilizarlo.
Comprueba el comando y el directorio de trabajo
Las rutas relativas se interpretan desde el directorio de trabajo actual del proceso, que puede ser distinto del directorio donde está el script o del que ves en el explorador de archivos. En una terminal, pwd (macOS o Linux) o cd (Símbolo del sistema de Windows) muestra el directorio actual. Para ir al directorio del proyecto, usa cd /path/to/project en macOS o Linux, o cd /d C:\path\to\project en el Símbolo del sistema. La opción /d cambia tanto la unidad como el directorio cuando hace falta. Sustituye estas rutas ilustrativas por la ubicación de tu equipo.
Después, ejecuta el comando previsto desde ese directorio o indica a Python la ruta del script relativa a tu ubicación actual. Por ejemplo, si el script está dentro de src y ejecutas el comando desde la raíz del proyecto, la ruta del script sería src/setup.py. También puedes usar una ruta absoluta si conoces la ubicación completa. Estos son ejemplos de comandos: usa la ruta y el comando que documenta tu proyecto, ya que no todos los proyectos utilizan setup.py.
Verifica la ruta y el nombre del archivo
Inspecciona el directorio de destino y compara el nombre exacto del archivo con la ruta del comando. En macOS o Linux, ls muestra el contenido del directorio actual y ls /path/to/project muestra el de un directorio concreto. En PowerShell, usa Get-ChildItem. Comprueba cada componente de la ruta, además del nombre del archivo: puede que el archivo esté en el proyecto, pero no en la ubicación que Python debe buscar.
Comprueba que la ortografía y las mayúsculas y minúsculas coincidan con el nombre que aparece en el disco. Algunos sistemas de archivos consideran que setup.py y Setup.py son nombres distintos; otros pueden no hacerlo. Usa el nombre y la ruta reales, sin dar por hecho que todos los sistemas distinguen igual las mayúsculas. Si el archivo tiene otro nombre previsto, corrige el comando o cambia el nombre solo si así lo establecen las convenciones del proyecto.
Los scripts que ya se están ejecutando pueden tener un problema de ruta relacionado: open("records.csv") busca esa ruta relativa desde el directorio de trabajo del proceso. Para no depender del lugar desde el que se ejecutó el comando, un script puede construir una ruta relativa a su propia ubicación con Path(__file__).resolve().parent / "records.csv". Ese ajuste se aplica a los archivos que abre el script; no cambia la forma en que Python localiza el argumento del script.
Restaura o vuelve a crear un archivo setup.py que falta
No todos los proyectos de Python necesitan setup.py; los proyectos modernos pueden usar otra configuración de compilación o no estar preparados para instalarse como paquetes. Primero consulta el README del repositorio, las instrucciones de instalación y los archivos de la raíz del proyecto. Si el comando documentado no requiere setup.py, utiliza el comando que proporciona el proyecto. Si sí lo requiere, comprueba si el archivo cambió de nombre, se omitió en una descarga o se eliminó del árbol de trabajo.
Si el proyecto utiliza Git, antes de recuperar nada, ejecuta git status y git log -- setup.py desde el repositorio. Que setup.py no esté bajo seguimiento no significa que debas añadirlo al proyecto; además, un archivo modificado podría contener trabajo que quieras conservar. Revisa el archivo y las indicaciones del proyecto antes de decidir qué hacer.
Si el historial muestra que un archivo bajo seguimiento se eliminó o modificó, inspecciona el commit correspondiente y tus cambios actuales antes de restaurarlo. Una restauración sustituye la copia de trabajo de ese archivo por la versión seleccionada; guarda primero las modificaciones que quieras conservar. Si el historial del proyecto nunca incluyó ese archivo, créalo solo a partir de los requisitos documentados del proyecto: un script de configuración improvisado podría no coincidir con sus dependencias ni con su configuración de empaquetado.
Comprueba el acceso y confirma la solución
Un error de ruta inexistente y uno de acceso denegado apuntan a problemas distintos. Si el archivo existe en la ruta solicitada, pero Python indica un problema de permisos, comprueba que tu cuenta pueda leerlo y que se permita el acceso a los directorios que lo contienen. En macOS o Linux, ls -l path/to/setup.py muestra los permisos; en Windows, consulta las propiedades de seguridad del archivo o utiliza la cuenta propietaria del proyecto. Cambia los permisos solo si la comprobación confirma que son la causa. Ejecutar como administrador o usar sudo no debería ser la solución predeterminada.
Ejecuta este ejemplo:
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
setup_file = Path(folder) / "setup.py"
setup_file.write_text("# project setup\n", encoding="utf-8")
print(f"{setup_file.name}: {'found' if setup_file.is_file() else 'missing'}")
setup.py: found
Este ejemplo autónomo crea un archivo temporal del proyecto y comprueba que la ruta corresponda a un archivo. En tu proyecto, aplica la misma comprobación de existencia a la ruta que identificaste; el ejemplo no demuestra que tu proyecto deba incluir setup.py.
Después de corregir el comando, el directorio o el archivo del proyecto, vuelve a ejecutar el comando documentado por el proyecto desde la ubicación prevista. Si aparece un error nuevo, usa la ruta y el traceback de ese mensaje para determinar si Python sigue sin poder abrir el script o si el código en ejecución no puede abrir otro recurso. Así, la siguiente comprobación se centrará en el archivo que realmente necesita el proceso.