49

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?

75

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
5
  • 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
12

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")
2
  • 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
7

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+'"')
2
  • 4
    You could suggest an edit to that post. – muru Oct 26 '15 at 10:25
  • 3
    What about using 'notify-send "{}" "{}"'.format(title, message) rather than adding strings? – Stam Kaly Jan 31 '17 at 21:22
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()
6
import os
mstr='Hello'
os.system('notify-send '+mstr)
3
  • How do I customize this notification? Like heading, image in notification, etc.? – mehulmpt Mar 25 '15 at 18:34
  • 3
    This version is vulnerable to arbitrary command execution. – Steve Oct 16 '18 at 3:05
  • If my edit is approved, I fixed the security problem – flying sheep Oct 14 '20 at 7:37
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.

1

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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.