Python

Python デスクトップ通知 plyer pyobjus macOS Mojave以降での回避策付き

インストール

pip install plyer

サンプルコード

from plyer import notification

notification.notify(title="タイトル",message="テスト",app_name="アプリ名",timeout=1)

macOSの場合は以下が必要

pip install git+http://github.com/kivy/pyobjus/

それでも私の環境(BigSur)では、以下のようなエラーが発生した。

File "/Users/user_name/opt/anaconda3/envs/py38/lib/python3.8/site-packages/plyer/platforms/macosx/notification.py", line 38, in _notify
    usrnotifctr.setDelegate_(self)

通知機能に関しては以下のPull Requestが本稿執筆時点でOpen状態であった。Apple Scriptでの対応が提案されている。(コメントによると、NSUserNotificationCenterの廃止により、Mojave+で問題が発生しているらしい)

ひとまずは、このプルリクを自分の環境に適用して対応する。エラーの発生があるファイルパスを確認し、

/Users/user_name/opt/anaconda3/envs/py38/lib/python3.8/site-packages/plyer/platforms/macosx/

notification.py の内容を以下で置き換える。

'''
Module of MacOS API for plyer.notification.
'''

from plyer.facades import Notification

import os

class OSXNotification(Notification):
    '''
    Implementation of MacOS notification API.
    '''

    def _notify(self, **kwargs):
        title = kwargs.get('title', '')
        message = kwargs.get('message', '')
        app_name = kwargs.get('app_name', '')
        sound_name = 'default'
        # app_icon, timeout, ticker are not supported (yet)

        title_text = f'with title "{title}"' if title != '' else ''
        subtitle_text = f'subtitle "{app_name}"' if app_name != '' else ''
        soundname_text = f'sound name "{sound_name}"'

        notification_text = f'display notification "{message}" {title_text} {subtitle_text} {soundname_text}'
        os.system(f"osascript -e '{notification_text}'")

def instance():
    '''
    Instance for facade proxy.
    '''
    return OSXNotification()

plyer/notification.py at 4b07158828dc50ca095de3156e43d9b4369de7b0 · kivy/plyer · GitHubより、引用。作者の方、プルリク中の方に感謝。