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?
7 Answers
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
- 140,996
- 54
- 308
- 426
-
2I 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
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")
- 171,546
- 47
- 376
- 404
-
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
-
From the link you've posted, you can also find [`Gio.Notification`](https://lazka.github.io/pgi-docs/#Gio-2.0/classes/Notification.html#Gio.Notification). I think they are separate? When would you use one or the other? – phil294 Jul 17 '23 at 21:20
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+'"')
- 1,137
- 37
- 16
- 21
- 2,170
- 1
- 11
- 10
-
4You could suggest [an edit to that post.](http://askubuntu.com/posts/479244/edit) – muru Oct 26 '15 at 10:25
-
3What about using `'notify-send "{}" "{}"'.format(title, message)` rather than adding strings? – Stam Kaly Jan 31 '17 at 21:22
import os
mstr='Hello'
os.system('notify-send '+mstr)
- 7,022
- 7
- 39
- 51
- 61
- 1
- 3
-
How do I customize this notification? Like heading, image in notification, etc.? – mehulmpt Mar 25 '15 at 18:34
-
3
-
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.
- 51
- 1
- 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-sendas 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-sendsubprocess 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 hasdbus-nextas its sole dependency.
notify = desktop_notify.aio.Notify('summary', 'body')
await notify.show()
- fossfreedom's answer covers GTK's
giintrospection route. But please note he uses a different API than the one mentioned above:- There's the
Gio.NotificationAPI, from Gio 2.4 onwards, mentioned bypynotify2 - And there's the
NotifyAPI, from GLib 2.0 onwards, used in @fossfreedom's code snippet.
- There's the
- 19,731
- 12
- 87
- 108