Como detectar el emulador de Terminal del sistema desde Python

La terminal es una herramienta que está disponible en todas las distribuciones Linux que hay, pero no es un único programa, existen múltiples emuladores de terminal que, generalmente, son parte del entorno de escritorio y hay ocasiones que es necesario saber cual se está usando en el sistema actual para poder leer ciertas configuraciones como el tema de colores o el tamaño por default en lineas y renglones, esto se pone complicado cunado nuestro script o aplicación en python necesita saber cual es el emulador de terminal por defecto en el sistema que se está ejecutando.

Para poder obtener esa información que necesitamos primero debemos saber que terminal está configurada como predeterminada en el sistema donde se ejecute nuestra aplicación en python y luego ver como vamos a leer esa información que buscamos.

El detectar este dato desde un script o aplicación de python parece complicado por que no se puede acceder datos del entorno de forma sencilla y la verdad es que encontrar este datos me tomó bastante tiempo en descubrir la manera, pero aquí te lo comparto para que no pierdas horas como me pasó a mi.

Es importante mencionar que esta forma puede de hacer esto puede funcionar en sistemas basado en Debian o Ubuntu, pero no se sí esté disponible para otras distribuciones o sistemas. Al final del post pondré una lista de las distribuciones en las que este código funciona correctamente.

Como saber cual es la terminal predeterminada en el ambiente gráfico desde Python 3.

En sistemas basados en Debian y Ubuntu existe un comando llamado x-terminal-emulator que en realidad es un enlace suave a un script en la ruta /etc/alternatives/x-terminal-emulator, este script ejecuta una terminal que previamente ha sido configurada y que puede cambiarse al ejecutar el comando:

sudo update-alternatives --config x-terminal-emulator

Al ejecutarse se puede seleccionar una opción de la lista de emuladores de terminal que haya disponibles en el sistema.

Para obtener el nombre o comando del emulador de terminal configurado se puede ejecutar el siguiente comando:

grep exec /usr/bin/x-terminal-emulator | awk -F "'" '{ print $2 }'

Si abres una terminal y lo ejecutas, por ejemplo en un sistema que tiene xfce como entorno gráfico la salida será algo como esto;

xfce4-terminal

Pero si lo ejecutas en una distribución que tenga Gnome 3 el nombre del emulador de terminal cambiará a esto:

gnome-terminal

Te preguntarás, ¿y para que sirve esto? Pues si tienes una aplicación de Python donde quieres configurar la apariencia de la terminal, o en la que deseas respaldar el tema, la paleta de colores o por ejemplo hace una aplicación que tenga una widget de Terminal y quieres que se vea igual a la terminal del sistema, entonces necesitas saber cual terminal es y como obtener esa información.

El primer punto de estos es detectar de esde python que emulador de terminal es el predeterminado y eso lo puedes hacer con el siguiente código:

#!/usr/bin/python3

import os

TERMINAL        = ""
if os.path.exists("/usr/bin/x-terminal-emulator"):
    TERMINAL = os.popen("grep exec /usr/bin/x-terminal-emulator | awk -F \"'\" '{ print $2 }' ").read()

message = "Terminal not detected" if TERMINAL == "" else TERMINAL
print(message)

De esta forma puedes tener el nombre del emulador de terminal del sistema en la variable TERMINAL y poder utilizarla entro de tu aplicación para lo que necesites. Como te comenté al principio del post, este código ha sido probado en las siguientes distribuciones linux:

  • Debian 10 Buster
  • Linux MX 19 «Patito feo»

Espero que este código te sea de utilidad y te ayude a lograr los objetivos de tu programa o aplicación en python.

Si has probado este código en otras distros compártenos tu experiencia en los comentarios de las distros que probaste que funciona y agregarla a esta lista.

This entry was posted in Python and tagged , , , . Bookmark the permalink.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


*