Enviar notificaciones de escritorio con Python

Publicado el 27 septiembre 2021 por Daniel Rodríguez @analyticslane

Al lanzar una tarea pesada, como puede ser una simulación Montecarlo, es habitual trabajar en otra cosa. No es productivo esperar sin hacer nada a la espera de que finalice la tarea. Por este motivo, para evitar estar pendiente de la finalización, puede ser interesante que el propio Python envíe una notificación al escritorio al terminar. Facilitando el uso de los resultados en cuanto se obtenga. Para enviar notificaciones de escritorio con Python se puede usar en Windows y Linux el paquete plyer, mientras que en Mac es necesario algo más de trabajo.

Crear una notificación con plyer

Uno de los paquetes de Python más utilizados para la creación de notificaciones es plyer. Un paquete que, como es habitual, se puede instalar mediante el uso de pip.

pip install plyer

Tras la instalación del paquete se puede importar la función notification del mismo para crear notificaciones. De este modo, para crear una notificación básica solamente hay que escribir un código como el siguiente.

from plyer import notification

notification.notify(
    title='Fin de simulación',
    message='La simulación ha finalizado')

Lo que, en Windows, genera una notificación como la que se muestra a continuación.

Notificación básica en Windows

Opciones avanzadas con notification

La función notification del paquete plyer tiene los siguientes parámetros con los que se puede modificar el comportamiento de las notificaciones.

  • title: Título de la notificación
  • message: Mensaje de la notificación
  • app_name: nombre de la aplicación que inicia esta notificación
  • app_icon: icono que se mostrará junto con el mensaje
  • timeout: tiempo para mostrar el mensaje, el valor predeterminado en 10
  • ticker: texto que se mostrará en la barra de estado cuando llegue la notificación
  • toast: mensaje simple en lugar de notificación completa

Además de los parámetros title y message quizás la más interesantes sea app_icon. Propiedad con la que es posible cambiar el icono de la notificación, facilitando la identificación de las lanzadas por nuestro programa. Para lo que solamente se necesita un archivo en formato ico cuya ruta se debe indicar mediante este parámetro. Lo que se muestra en el siguiente ejemplo.

notification.notify(
    title='Fin de simulación',
    message='La simulación ha finalizado',
    app_icon='python.ico',
    timeout = 15)

Consiguiendo la siguiente notificación.

Notificación con iconos en Windows

Notificaciones en macOS

En el caso lanzar el código anterior en macOS nos encontraremos con un error similar a AttributeError: 'NoneType' object has no attribute 'setDelegate_', en lugar de la notificación. Esto es porque actualmente no se puede usar plyer en macOS. Aunque esto es un problema que se puede solucionar fácilmente ya que en macOS es posible enviar notificaciones. A lo que se puede acceder mediante la función os.system().

import os

title = 'Fin de simulación'
message = 'La simulación ha finalizado'

os.system("osascript -e 'display notification \"{}\" with title \"{}\"'".format(message, title))

Obtenido el siguiente mensaje.

Notificación básica en Mac

Notificaciones en varias plataformas

Puede ser que a la hora de escribir el código no sepamos el sistema operativo donde se va a ejecutar. Afortunadamente es posible preguntar a Python cuál es la platarforma en la que estamos trabajando mediante el uso de platform.system(). En el caso de estar en macOS devolverá 'Darwin', por lo que la siguiente función es válida tanto en Windows como en macOS.

import os
import platform

from plyer import notification

def notify(message, title):
    if platform.system() == 'Darwin':
        os.system("osascript -e 'display notification \"{}\" with title \"{}\"'".format(message, title))
    else:
        notification.notify(
            title=title,
            message=message,
            app_icon='python.ico')
        
notify('La simulación ha finalizado', 'Fin de simulación')

Conclusiones

Hoy hemos visto cómo se puede hacer para enviar notificaciones de escritorio con Python tanto en Windows como en macOS. Una herramienta que puede ser de utilidad cuando tengamos scripts que requieran tiempo para ejecutarse y no deseemos estar pendiente de que estos terminan.

Imagen de Picography en Pixabay