Módulo pkg_resources no encontrado en ambientes UV#

Si como muchos, ya has iniciado la migración al gestor de paquetes uv, puede que te hayas encontrado con el problema de ModuleNotFoundError: No module named 'pkg_resources'. No te preocupes, esto no será un obstáculo para continuar la migración.

¿Qué es pkg_resources?#

El módulo de pkg_resources pertenece al paquete de setuptools y permite el acceso a los archivos de recursos y el descubrimiento de extensiones. Sin embargo, este módulo no es recomendable y ha sido marcado como obsoleto, y en su lugar se debería usar importlib.resources e importlib.metadata. Sin embargo, así esté obsoleto, muchos paquetes lo usan. ¿Qué produce el error?

¿Qué es Setuptools?#

Setuptools es una biblioteca diseñada para ayudar a generar paquetes de bibliotecas Python, con rutinas complementarias a distutils. Sin embargo, esta biblioteca no es parte del core de Python y es realmente un paquete independiente. La instalación base en los sistemas operativos o la instalación estándar de Python o de algunos gestores de ambientes como conda, la suelen incluir. Pero la instalación creada con el ambiente de uv no la posee. Aquí se origina el problema, es que muchos paquetes dependen de la suposición de tener setuptools ya instalado por defecto, y uv no lo dispone de esta forma. Python por defecto no dispone de una herramienta de empaquetado y publicación como parte de su core (setuptools está bajo el gobierno de PyPA, pero esto no implica que sea core).

Agregar setuptools a las dependencias#

Con el contexto anterior, nos queda una solución clara. El problema no es de uv, es que los paquetes afectados han olvidado añadir en sus dependencias el paquete de setuptools. Siendo así, nuestra solución al problema es simple: añadir setuptools a las dependencias.

Si tu proyecto usa el archivo requirements.txt este es el lugar adecuado para añadirlo (ver Instalación de paquetes Python), pero si usas la gestión de proyectos de uv puedes usar uv add setuptools, y si es una herramienta será necesario inyectar la dependencia --with setuptools.

Referencias#