En utilisant python, je souhaite envoyer un message au Centre de notifications OSX . Quelle bibliothèque dois-je utiliser? devrais-je écrire un programme dans Objective-C, puis appeler ce programme depuis python?
mettre à jour
Comment accéder aux fonctionnalités du centre de notifications pour 10.9 telles que les boutons et le champ de texte?
Vous devez installer terminal-notifier first avec Ruby par exemple:
$ [Sudo] gem install terminal-notifier
Et puis vous pouvez utiliser ce code:
import os
# The notifier function
def notify(title, subtitle, message):
t = '-title {!r}'.format(title)
s = '-subtitle {!r}'.format(subtitle)
m = '-message {!r}'.format(message)
os.system('terminal-notifier {}'.format(' '.join([m, t, s])))
# Calling the function
notify(title = 'A Real Notification',
subtitle = 'with python',
message = 'Hello, this is me, notifying you!')
Et voilà:
Toutes les autres réponses ici nécessitent des bibliothèques tierces; celui-ci ne nécessite rien. Il utilise simplement un script Apple pour créer la notification:
import os
def notify(title, text):
os.system("""
osascript -e 'display notification "{}" with title "{}"'
""".format(text, title))
notify("Title", "Heres an alert")
Notez que cet exemple n'échappe pas aux guillemets, aux guillemets doubles ni aux autres caractères spéciaux. Ces caractères ne fonctionneront donc pas correctement dans le texte ou le titre de la notification.
copie de: https://Gist.github.com/baliw/4020619
ce qui suit fonctionne pour moi.
import Foundation
import objc
import AppKit
import sys
NSUserNotification = objc.lookUpClass('NSUserNotification')
NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter')
def notify(title, subtitle, info_text, delay=0, sound=False, userInfo={}):
notification = NSUserNotification.alloc().init()
notification.setTitle_(title)
notification.setSubtitle_(subtitle)
notification.setInformativeText_(info_text)
notification.setUserInfo_(userInfo)
if sound:
notification.setSoundName_("NSUserNotificationDefaultSoundName")
notification.setDeliveryDate_(Foundation.NSDate.dateWithTimeInterval_sinceDate_(delay, Foundation.NSDate.date()))
NSUserNotificationCenter.defaultUserNotificationCenter().scheduleNotification_(notification)
notify("Test message", "Subtitle", "This message should appear instantly, with a sound", sound=True)
sys.stdout.write("Notification sent...\n")
Pour une implémentation en Python uniquement, j'ai modifié le code qu'une personne a posté dans le cadre d'une autre question connexe et cela fonctionne bien pour moi:
import mmap, os, re, sys
from PyObjCTools import AppHelper
import Foundation
import objc
import AppKit
import time
from threading import Timer
from datetime import datetime, date
# objc.setVerbose(1)
class MountainLionNotification(Foundation.NSObject):
# Based on http://stackoverflow.com/questions/12202983/working-with-mountain-lions-notification-center-using-pyobjc
def init(self):
self = super(MountainLionNotification, self).init()
if self is None: return None
# Get objc references to the classes we need.
self.NSUserNotification = objc.lookUpClass('NSUserNotification')
self.NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter')
return self
def clearNotifications(self):
"""Clear any displayed alerts we have posted. Requires Mavericks."""
NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter')
NSUserNotificationCenter.defaultUserNotificationCenter().removeAllDeliveredNotifications()
def notify(self, title, subtitle, text, url):
"""Create a user notification and display it."""
notification = self.NSUserNotification.alloc().init()
notification.setTitle_(str(title))
notification.setSubtitle_(str(subtitle))
notification.setInformativeText_(str(text))
notification.setSoundName_("NSUserNotificationDefaultSoundName")
notification.setHasActionButton_(True)
notification.setActionButtonTitle_("View")
notification.setUserInfo_({"action":"open_url", "value":url})
self.NSUserNotificationCenter.defaultUserNotificationCenter().setDelegate_(self)
self.NSUserNotificationCenter.defaultUserNotificationCenter().scheduleNotification_(notification)
# Note that the notification center saves a *copy* of our object.
return notification
# We'll get this if the user clicked on the notification.
def userNotificationCenter_didActivateNotification_(self, center, notification):
"""Handler a user clicking on one of our posted notifications."""
userInfo = notification.userInfo()
if userInfo["action"] == "open_url":
import subprocess
# Open the log file with TextEdit.
subprocess.Popen(['open', "-e", userInfo["value"]])
Vous pourriez probablement nettoyer les instructions d'importation pour supprimer certaines importations inutiles.
Essayez ntfy si vous souhaitez également que le script puisse communiquer avec vous via d'autres périphériques.
[Sudo] pip install ntfy
où pip
fait référence au programme d'installation du package de la version cible de Python
Pour l'installation de Python3:
[Sudo] pip3 install ntfy
J'utilise cette fonction simple pour les notifications concernant l'exécution de commandes et la fin du téléchargement:
def notification(title, message):
"""Notifies the logged in user about the download completion."""
import os
cmd = 'ntfy -t {0} send {1}'.format(title, message)
os.system(cmd)
notification("Download Complete", "Mr.RobotS01E05.mkv saved at /path")
Cet outil est très pratique car il enregistre toutes les notifications directement dans le centre de notification plutôt que de faire référence à une autre application tierce.
Prise en charge de plusieurs supports: Cet outil peut se connecter à tout appareil via des services tels que PushBullet, SimplePush, Slack, Telegram, etc. Consultez la liste complète des services backend pris en charge ici .
Voici un moyen (vous avez besoin du module Fondation):
from Foundation import NSUserNotification
from Foundation import NSUserNotificationCenter
from Foundation import NSUserNotificationDefaultSoundName
class Notification():
def notify(self, _title, _message, _sound = False):
self._title = _title
self._message = _message
self._sound = _sound
self.notification = NSUserNotification.alloc().init()
self.notification.setTitle_(self._title)
self.notification.setInformativeText_(self._message)
if self._sound == True:
self.notification.setSoundName_(NSUserNotificationDefaultSoundName)
center = NSUserNotificationCenter.defaultUserNotificationCenter()
center.deliverNotification_(self.notification)
N = Notification()
N.notify(_title="SOME", _message="Something", _sound=True)
Cela ne fonctionne que pour MAC. Espérons que vous apprécierez!