Скрипт, использующий notify-send, отказывается при запуске из Startup Applications
Я хочу запустить скрипт Python, который выдает уведомление на рабочем столе при запуске в Ubuntu 12.04. Как я могу это сделать?
Я попробовал несколько распространенных способов. При запуске в команде "ps aux" моя программа указана, но графический интерфейс не виден. Обычные скрипты запускаются, но скрипты с графическим / сетевым интерфейсом создают проблему.
- Мой bash-скрипт по сути для запуска Python-скрипта, который повторяет системную команду.
- Если я вручную запустил программу позже, она работает нормально.
import codecs
import time
import urllib2
import os
st = "NULL"
date = time.strftime("%d-%m")
try:
st = urllib2.urlopen("XYZ.html").read()
except:
pass
if st != "NULL":
st.split("XYZ")[0].split("</table>")[0]
if date in st:
new = st.split(date)[1:]
events = ""
for j in new:
events += (j.split("</td><td>")[1].split("</td></tr>")[0] + "\n")
events = events[:-1]
else:
events = "Nothing special"
to_send = "notify-send -i A/B/C.ico " + "'Calender " + date + "-2015' '" + events +"'"
os.system(to_send)
else:
to_send = "notify-send -i A/B/C.ico " + "'Calender " + date + "-2015' 'Check Internet connection'"
os.system(to_send)
exit(0)
1 ответ
Запуск команд при входе
Обычно это один из тех случаев, когда команда прерывается, если она выполняется слишком быстро в процессе входа в систему. Рабочий стол еще не загружен полностью, и команда не может быть запущена.
Добавьте в свои автозагрузку приложения перерыв перед запуском скрипта, и он будет работать нормально:
/bin/bash -c "sleep 15 && python2 /path/to/script.py"
Я протестировал ваш сценарий как с перерывом, так и без него, и действительно провалился, если запустил его без, но с перерывом это удалось.
Несколько замечаний
- Имейте в виду, что если вы не используете Шебанг (
#!/usr/bin/env python
) путь к сценарию должен предшествоватьpython
запустить его. Неважно, исполняемый он или нет. На более медленных системах (или на ВМ) перерыв в 15 секунд может быть недостаточным. Если это так, попробуйте начать с относительно длительного перерыва, экспериментируя "вниз" до предела.
О сценарии; на самом деле не смотрел в это, но я определенно не буду использовать
os.system
больше, используйтеsubprocess.Popen()
вместо этого, и, о, вы можете сохранить строку, удалив первыйos.system(to_send)
и отступ от второго, так как вы будете запускать команду в обоих случаях послеif
/else
маршрут.:)