Un blog personal

Solucionando un problema con Python 3.11 y GI en Ubuntu 22.04 LTS.

· Esteban Zapata Rojas

¡Hola a todos!

Después de un pequeño descanso en el blog, decidí volver en parte por dos cosas:

  1. Un genial post de Julia Evans, donde explica mitos y realidades de tener un blog. Estaba pasando por un momento de cansancio y ese post me inspiró a seguir escribiendo.
  2. Un error que se me presentó en Ubuntu 22.04 LTS con python y gnome 🐍.

Así que pues… ¡me tendrán más seguido por acá! pero bueno, al punto.

El Problema

Yo soy un desarrollador Ruby, nada del otro mundo, pero en mi trabajo a veces recibo aplicaciones en python y me toca reescribirlas o simplemente integrar otros servicios a esas plataformas. En mi opinión, no me gusta este lenguaje. Y muchos otros tratan de explicar mejor que yo el porqué no es el mejor (como este autor).

Lo que más me molesta de python es su manejo de dependencias y, aunque hay alternativas muy buenas como poetry o PDM que conozco y hacen muy bien su trabajo, al parecer carecen de muchas barreras para ser adoptados por la comunidad y termina uno con muchos proyectos con diferentes sabores. En fin, no me gusta ni cinco.

Resulta y sucede, que una de las aplicaciones que recibí, decidí correrla en la última versión de Python (3.11), pero mi estación de trabajo sólo tenia instalado la versión anterior (3.10). Pues ni corto ni perezoso, lo que hice fue añadir el genial paquete deadsnakes 💀 🐍 y correr sudo apt-get install python3.11 (Sí, sí, no uso apt, soy un hereje).

Todo muy de maravilla, hasta que decidí actualizar el python3 shortcut para que apuntara a python3.11 en vez de python3.10.

Hay maneras para actualizar correctamente las versiones de python en Ubuntu, en especial con el comando sudo update-alternatives --config python3, pero como yo soy de la vieja escuela del mundo linux, lo que hice fue un sudo rm /usr/bin/python3 && sudo ln -s /usr/bin/python3 /usr/bin/python3.11.

Cerré la terminal y cuando la fui a abrir nuevamente, nada pasó. Literalmente nada pasó. No pude abrirla.

Después de abrir la shell interactiva con CTRL + ALT + F3 e iniciar sesión, me di cuenta que al ejecutar gnome-terminal me salió lo siguiente:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/gi/__init__.py", line 42, in <module>
    from . import _gi
ImportError: cannot import name '_gi' from partially initialized module 'gi' (most likely due to a circular import) (/usr/lib/python3/dist-packages/gi/__init__.py)

😱 ¡La hecatombe! Si la terminal de GNOME no abria, eso significaba que había una gran posibilidad de tener otras aplicaciones con el mismo inconveniente 😭.

Los intentos de solución.

Por si no sabian, yo hice un curso de búsqueda avanzada en Google, por lo que utilicé mis mejores skills y me puse a buscar de forma insaciable en DuckDuckGo 🦆 (el mejor buscador que hay, sin dudas).

Resulta y sucede que este error suele pasar mucho cuando se hace ese cambio de versión de python, y la solución más común era crear un link simbólico al wheel de GI de la versión anterior e intentar nuevamente. Esto con el objetivo de engañar a Python y hacerle crear que la librería está disponible.

Como buen desarrollador, sé que los cambios de versión pueden traer inconvenientes con versiones anteriores, así que descarté por completo intentarlo. Así que de nuevo, seguí buscando alternativas de solución.

La siguiente más común (y que no funcionó), fue la de instalar la librería con PIP y el intérprete Python 3.11, pero tampoco tuve frutos. Acá dejo los comandos por si alguien está interesado en saber cómo se hace:

# Install GI and PyGObject with pip
sudo apt-get install python3.11-dev libcairo2 libcairo2-dev libgirepository1.0-dev

python3.11 -m pip install pycairo

python3.11 -m pip install pgi

python3.11 -m pip install PyGObject

Los paquetes compilaron sin problemas, pero el error persistía 🔱 ‼️.

La solución final

Después de mucho meditar, decidí irme por la versión más efectiva: Compilar desde el código fuente. Esta opción sé que es efectiva porque:

  • Tengo acceso directo al código fuente de Python y puedo identificar exactamente dónde se está presentando un problema con la aplicación.
  • Se está compilando para mi sistema operativo con mi configuración y mis opciones, por lo que correría en caso que GI no fuera una dependencia obligatoria.
  • Instalaría las dependencias obligatorias en caso que estas no estén disponibles en el sistema operativo.

Pues dicho y hecho, una vez compilado he instalado con las opciones enable-optimizations --enable-loadable-sqlite-extensions automáticamente abrió la terminal. Sip, como por arte de Magia, apenas terminó de instalar y salirme de la shell interactiva con CTRL + ALT + F2, ahí estaba, ¡esperando por mi para mandarle comandos y dañar Ubuntu nuevamente! 😒.

Tiempo total invertido para solucionar el problema: 3 Horas.

No fue divertido al inicio y tampoco al final, pero me sentí aliviado de poder haberlo solucionado. Acá les dejo el tutorial para que instalen Python desde el código fuente. Aplica para cualquier versión de Python: https://ubuntuhandbook.org/index.php/2021/10/compile-install-python-3-10-ubuntu/ .

También les dejo esta interesante pregunta sobre el mismo error que estaba presenciando: https://askubuntu.com/questions/1397938/terminal-not-opening-after-changing-python-version .

En pocas palabras, no cambies la versión de Python de Ubuntu a menos que quieras pasar un mal rato 😅.

¡Chau! 🍻.