Mac環境とUbuntu環境におけるデスクトップ通知

デスクトップ通知とは、デスクトップで全てのアプリケーションより上のレイヤにバルーンあるいはポップアップの形式でメッセージを表示するものを指す。
結果の出力に時間のかかるプログラムを端末で動かしている場合など、プログラムを動かしている端末から目を離したい場合が時々ある。しかし、プログラムがエラーにより落ちたり、あるいは正常に終了した場合に、端末から目を離していてはすぐに対応することが出来ない。
そこで、プログラムからデスクトップ通知を用いることで、全てのアプリケーションより上のレイヤに任意のメッセージを表示することが出来るので、プログラムの挙動に対しすぐに対応することが出来る。

Mac環境のデスクトップ通知: Growl

Macでデスクトップ通知と言えばGrowlがある。
AppleScriptによるGrowlによるデスクトップ通知を出すプログラムは以下のようになる。

tell application "GrowlHelperApp"
	register as application "GrowlTest" all notifications {"Error", "Info"} default notifications {"Info"} icon of application "Script Editor.app"
	-- アプリケーションのアイコン指定の他、画像ファイルの指定も可
	notify with name "Info" title "This is a Title" description "This is a Description" application name "GrowlTest"
end tell

Growl SDKパッケージを開き、Bindings/Pythonディレクトリに、Pythonで用いるためのGrowlライブラリがあるのでインストールするとPythonプログラムからGrowlによるデスクトップ通知を出すことが出来る。

import Growl
g = Growl.GrowlNotifier(applicationName='GrowlTest',
                        notifications=['Info', 'Error'])
g.register()

imagePath = "/Applications/R.app/Contents/Resources/RLogo.png"
iconfile = Growl.Image.imageFromPath(imagePath)
g.notify(noteType='Info',
         title='GrowlTest',
         description='This is a Description.',
         icon=iconfile,
         sticky=False)

Growlはネットワークを通してリモートマシンにデスクトップ通知を送ることが出来る(http://growl.info/documentation/developer/protocol.php)。このプロトコルを用いたアプリケーションには、Growlのパッケージに含まれているgrowlnotifyがある(growlnotifyはネットワーク経由でないデスクトップ通知も可能)。

$ growlnotify -m "This is a Message" -u -H "localhost"


ネットワーク経由の通知の場合、アイコンの設定は出来ない。
growlnotifyで-n(--name)オプションを設定しない場合、デフォルトの名前:growlnotifyが用いられるためデスクトップ通知が表示される。独自の名前をネットワーク経由の通知で設定する場合、予め、Growlの設定から「リモートアプリケーション登録を許可」し、パスワードを設定する必要がある。そして、growlnotifyでその独自の名前を用いる場合には、パスワードを-P(--password)オプションを設定する。リモートアプリケーション登録を許可しない場合、独自の名前を用いた通知は無視される。

PythonGrowlライブラリでもネットワーク経由のデスクトップ通知を行うことが出来る。

import Growl

ui = {'ApplicationName': 'growlnotify',
      'NotificationDescription': 'This is a Description',
      'AllNotifications': ['Command-Line Growl Notification'],
      'DefaultNotifications': [0],
      'NotificationName': 'Command-Line Growl Notification',
      'NotificationTitle': 'This is a Title'}

n = Growl.netgrowl("localhost", None)
# リモートアプリケーション登録を許可している場合、あるいは登録済みのリモートアプリケーション名を用いる場合、パスワードを入れる

# n.PostRegistration(ui)  # リモートアプリケーション登録をする
n.PostNotification(ui)

ネットワーク経由の通知はUDPパケットを送るだけなので、Growlライブラリを用いる必要はない。Growlライブラリ内のGrowl.pyからnetgrowlクラス辺りをプログラムにコピペしても使える。

Ubuntu環境のデスクトップ通知: xmessageとNotifyOSD

Ubuntuに限らず、X11環境がインストールされている環境では、xmessageコマンドを用いることが出来る。

$ xmessage -button '' -timeout 2 "This is a short Message"

Ubuntuでのデスクトップ通知は、標準でNotifyOSDという機能が搭載されている。libnotify-binパッケージをインストールすると、notify-sendというコマンドが使える。

$ notify-send -i /usr/share/icons/application-default-icon.png "This is a Summary" "This is a Body"

python-pynotifyパッケージをインストールすると、PythonプログラムからNotifyOSDによるデスクトップ通知を出すことが出来る。

import pynotify
pynotify.init("My Application")
n = pynotify.Notification("This is a Title",
                          "This is a Description",
                          "/usr/share/icons/application-default-icon.png")
n.show()

NotifyOSDではネットワーク経由のデスクトップ通知は出来ないようだ。