Скрипт, использующий 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 маршрут.:)

Другие вопросы по тегам