54

I wrote a python code for getting random text into a .txt file. Now I want to send this random text into notification area via 'notify-send' command. How do we do that?

Takkat
  • 142,284

7 Answers7

85

We can always call notify-send as a subprocess, e.g like that:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import subprocess

def sendmessage(message): subprocess.Popen(['notify-send', message]) return

Alternatively we could also install python-notify2 or python3-notify2 and call the notification through that:

import notify2

def sendmessage(title, message): notify2.init("Test") notice = notify2.Notification(title, message) notice.show() return

Takkat
  • 142,284
  • 2
    I had to use subprocess.Popen(['notify-send', message]) to make the first example work. – lgarzo Feb 29 '12 at 16:52
  • The second one a pynotify.init("Test") and pynotify.Notification(title, message).show(). By the way I'm „Learning Python The Hard Way”, so I might just overlook something... – lgarzo Feb 29 '12 at 17:07
  • So sorry for that. I was unable to test this earlier on my box at work - my bad. Edited the missing bits in. – Takkat Feb 29 '12 at 17:21
  • There is a notify2 package in Python 2.7.12 as well so might as well use it on Ubuntu 16.04 as well 18.04 and 20.04 so you don't have to modify your code. – WinEunuuchs2Unix Oct 31 '20 at 19:13
  • 1
    @WinEunuuchs2Unix: thanks for the notice - included :) – Takkat Oct 31 '20 at 20:02
14

python3

Whilst you can call notify-send via os.system or subprocess it is arguably more consistent with GTK3 based programming to use the Notify gobject-introspection class.

A small example will show this in action:

from gi.repository import GObject
from gi.repository import Notify

class MyClass(GObject.Object): def init(self):

    super(MyClass, self).__init__()
    # lets initialise with the application name
    Notify.init("myapp_name")

def send_notification(self, title, text, file_path_to_icon=""):

    n = Notify.Notification.new(title, text, file_path_to_icon)
    n.show()

my = MyClass() my.send_notification("this is a title", "this is some text")

fossfreedom
  • 172,746
  • Not just more consistent with Gtk programming, but also it's a single process: there's no fork-exec going on, so no waste of resources on spawning new process just to send a notification bubble, plus Popen() will call shell to run the command, so there's shell process popping up too. – Sergiy Kolodyazhnyy Oct 15 '18 at 23:20
  • @SergiyKolodyazhnyy Using Gtk when you don't need to requires a lot of work. Much simpler to install python-notify2 or python3-notify2. As for Popen() the newer subprocess methods (using popen) allow you to turn off the shell which is a security risk at times. I probably could have worded this better but I'm still learning python. – WinEunuuchs2Unix Oct 31 '20 at 19:16
  • 1
    From the link you've posted, you can also find Gio.Notification. I think they are separate? When would you use one or the other? – phil294 Jul 17 '23 at 21:20
8

To answer Mehul Mohan question as well as propose the shortest way to push a notification with title and message sections:

import os
os.system('notify-send "TITLE" "MESSAGE"')

Putting this in function might be a bit confusing due to quotes in quotes

import os
def message(title, message):
  os.system('notify-send "'+title+'" "'+message+'"')
Silver Ringvee
  • 2,170
  • 1
  • 12
  • 10
7

You should use notify2 package, it is a replacement for python-notify. Use it as followed.

pip install notify2

And the code:

import notify2
notify2.init('app name')
n = notify2.Notification('title', 'message')
n.show()
Suzana
  • 392
jcofta
  • 71
  • 1
  • 3
6
import os
mstr='Hello'
os.system('notify-send '+mstr)
amc
  • 7,142
5

For anyone looking at this in +2018, I can recommend the notify2 package.

This is a pure-python replacement for notify-python, using python-dbus to communicate with the notifications server directly. It’s compatible with Python 2 and 3, and its callbacks can work with Gtk 3 or Qt 4 applications.

2

PyNotify2, suggested by many answers, considers itself as deprecated as of late 2020:

notify2 is - or was - a package to display desktop notifications on Linux. Those are the little bubbles which tell a user about e.g. new emails.

notify2 is deprecated. Here are some alternatives:

  • desktop_notify is a newer module doing essentially the same thing.
  • If you’re writing a GTK application, you may want to use GNotification (intro, Python API).
  • For simple cases, you can run notify-send as a subprocess. The py-notifier package provides a simple Python API around this, and can also display notifications on Windows.

So, given the above suggestions:

  • The notify-send subprocess approach is already explained in other answers, and py-notifier can simplify that, with an added bonus of working on Windows platforms using win10toast, but also with all the drawbacks of a subprocess call under the hood:
from pynotifier import Notification

Notification( title='Notification Title', description='Notification Description', icon_path='path/to/image/file/icon.png', duration=5, urgency=Notification.URGENCY_CRITICAL ).send()

  • desktop_notify seems to use DBus directly, just like PyNotify2, and has dbus-next as its sole dependency.
notify = desktop_notify.aio.Notify('summary', 'body')
await notify.show()
  • fossfreedom's answer covers GTK's gi introspection route. But please note he uses a different API than the one mentioned above:
    • There's the Gio.Notification API, from Gio 2.4 onwards, mentioned by pynotify2
    • And there's the Notify API, from GLib 2.0 onwards, used in @fossfreedom's code snippet.
MestreLion
  • 20,086