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 WindowsOpciones 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 WindowsNotificaciones 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 MacNotificaciones 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