Notification OSX depuis un script python

Quand on lance un long script python, on ne garde pas forcément le Terminal ouvert sous les yeux.
Voici donc comment envoyer une notification au Notification Center de OSX depuis le script python.

Le réel intérêt de cet article est de montrer comment accéder aux API Apple depuis un script python.

On peut tester avec la commande suivante :

./osx-notify.py --title 'Attention !' --subtitle 'Python vous informe :' --message 'La commande python requiert votre intervention'

#!/usr/bin/env python
from AppKit import NSImage
from Foundation import NSUserNotification
from Foundation import NSUserNotificationCenter
from Foundation import NSUserNotificationDefaultSoundName
from optparse import OptionParser

def _nsimage_from_file(filename, dimensions=None, template=None):
"""Take a path to an image file and return an NSImage object."""
try:
with open(filename):
pass
except IOError: # literal file path didn't work -- try to locate image based on main script path
try:
from __main__ import __file__ as main_script_path
main_script_path = os.path.dirname(main_script_path)
filename = os.path.join(main_script_path, filename)
except ImportError:
pass
with open(filename): # file doesn't exist
pass # otherwise silently errors in NSImage which isn't helpful for debugging
image = NSImage.alloc().initByReferencingFile_(filename)
image.setScalesWhenResized_(True)
image.setSize_((20, 20) if dimensions is None else dimensions)
if not template is None:
image.setTemplate_(template)
return image

def main():
parser = OptionParser(usage='%prog -t TITLE -m MESSAGE')
parser.add_option('-t', '--title', action='store', default='A title')
parser.add_option('-s', '--subtitle', action='store', default='...')
parser.add_option('-m', '--message', action='store', default='...')
parser.add_option('-i', '--image', action='store', default=None)
parser.add_option('--no-sound', action='store_false', default=True,
dest='sound')

options, args = parser.parse_args()
image = _nsimage_from_file(options.image)

notification = NSUserNotification.alloc().init()
notification.setTitle_(options.title)
notification.setSubtitle_(options.subtitle)
if options.image:
image = _nsimage_from_file(options.image)
notification.setContentImage_(image)
notification.setInformativeText_(options.message)
if options.sound:
notification.setSoundName_(NSUserNotificationDefaultSoundName)

center = NSUserNotificationCenter.defaultUserNotificationCenter()
center.deliverNotification_(notification)

if __name__ == '__main__':
main()

Publié dans Non classé.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *