Почему автозапуск Openbox не запускает некоторые программы?

Я пытаюсь заставить некоторые программы PyQt запускаться автоматически с помощью файла Openbox /etc/X11/openbox/autostart, Автозапуск Openbox успешно запускает следующий пример программы:

import sys
from PyQt4.QtGui import *
application = QApplication(sys.argv)
button = QPushButton("hello world", None)
button.show()
application.exec_()

Это запускается с помощью следующей команды в файле автозапуска:

/usr/bin/python /usr/share/test/test.py

Тем не менее, автозапуск не запускает более сложную программу (которая указана в конце этого поста и взята отсюда). Я подтвердил, что более сложная программа успешно запускается как с пользовательскими, так и с корневыми учетными записями, поэтому мне неясно, почему она не запускается с автозагрузкой Openbox.

Он запускается с помощью следующей команды в оболочке:

/usr/bin/python /usr/share/test/ucom-panel.py

Как эта более сложная программа может быть запущена Openbox?

#!/usr/bin/env python

"""
################################################################################
#                                                                              #
# UCOM-panel                                                                   #
#                                                                              #
################################################################################
#                                                                              #
# LICENCE INFORMATION                                                          #
#                                                                              #
# This program is a desktop environment panel.                                 #
#                                                                              #
# copyright (C) 2016 William Breaden Madden                                    #
#                                                                              #
# This software is released under the terms of the GNU General Public License  #
# version 3 (GPLv3).                                                           #
#                                                                              #
# This program is free software: you can redistribute it and/or modify it      #
# under the terms of the GNU General Public License as published by the Free   #
# Software Foundation, either version 3 of the License, or (at your option)    #
# any later version.                                                           #
#                                                                              #
# This program is distributed in the hope that it will be useful, but WITHOUT  #
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or        #
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for     #
# more details.                                                                #
#                                                                              #
# For a copy of the GNU General Public License, see                            #
# <http://www.gnu.org/licenses/>.                                              #
#                                                                              #
################################################################################

Usage:
    program [options]

Options:
    -h, --help               display help message
    --version                display version and exit
    -v, --verbose            verbose logging
    -s, --silent             silent
    -u, --username=USERNAME  username
    --foregroundcolor=COLOR  foreground color         [default: ffffff]
    --backgroundcolor=COLOR  background color         [default: 3861aa]
    --paneltext=TEXT         panel text               [default: UCOM]
    --windowframe=BOOL       include window frame     [default: false]
    --alwaysontop=BOOL       set always on top        [default: true]
    --setposition=BOOL       set launcher position    [default: true]
    --screennumber=NUMBER    set launch screen number [default: -1]
"""

name    = "UCOM-panel"
version = "2016-12-23T0400Z"
logo    = None

import docopt
import logging
import os
import propyte
from PyQt4 import QtGui, QtCore
import subprocess
import shijian
import sys
import threading
import time

def main(options):

    global program
    program = propyte.Program(
        options = options,
        name    = name,
        version = version,
        logo    = logo
    )
    global log
    from propyte import log

    program.color_1           = options["--foregroundcolor"]
    program.color_2           = options["--backgroundcolor"]
    program.panel_text        = options["--paneltext"]
    program.window_frame      = options["--windowframe"].lower() == "true"
    program.set_always_on_top = options["--alwaysontop"].lower() == "true"
    program.set_position      = options["--setposition"].lower() == "true"
    program.screen_number     = int(options["--screennumber"])

    application = QtGui.QApplication(sys.argv)
    panel = Panel()
    panel.move(
        application.desktop().screenGeometry(program.screen_number).left(),
        application.desktop().screenGeometry(program.screen_number).top()
    )
    sys.exit(application.exec_())

class Panel(QtGui.QWidget):

    def __init__(
        self,
        ):
        super(Panel, self).__init__()

        self.text_panel = QtGui.QLabel(program.panel_text)

        self.indicator_percentage_power = QtGui.QLabel(self)

        self.indicator_clock = QtGui.QLabel(self)

        self.menu = QtGui.QMenu(self)
        self.menu.addAction("Openbox Configuration Manager")
        self.menu.addAction("unity-control-center")
        self.menu.addAction("close panel")
        self.menu.addAction("suspend")
        self.menu.addAction("hibernate")
        self.menu.addAction("reboot")
        self.menu.addAction("shut down")
        self.menu.triggered[QtGui.QAction].connect(self.process_menu)

        self.button_menu = QtGui.QPushButton("settings")
        self.button_menu.setMenu(self.menu)

        hbox = QtGui.QHBoxLayout()
        if program.panel_text != "":
            hbox.addWidget(self.text_panel)
        hbox.addStretch(1)
        hbox.addWidget(self.indicator_percentage_power)
        hbox.addSpacing(30)
        hbox.addWidget(self.indicator_clock)
        hbox.addSpacing(30)
        hbox.addWidget(self.button_menu)
        self.setLayout(hbox)

        self.setStyleSheet(
            """
            color: #{color_1};
            background-color: #{color_2}
            """.format(
                color_1 = program.color_1,
                color_2 = program.color_2
            )
        )

        self.text_panel.setStyleSheet(
            """
            QLabel{{
                color: #{color_1};
                background-color: #{color_2};
                /*
                border: 1px solid #{color_1};
                */
            }}
            """.format(
                color_1 = program.color_1,
                color_2 = program.color_2
            )
        )

        self.indicator_percentage_power.setStyleSheet(
            """
            QLabel{{
                color: #{color_1};
                background-color: #{color_2};
                /*
                border: 1px solid #{color_1};
                */
            }}
            """.format(
                color_1 = program.color_1,
                color_2 = program.color_2
            )
        )

        self.indicator_clock.setStyleSheet(
            """
            QLabel{{
                color: #{color_1};
                background-color: #{color_2};
                /*
                border: 1px solid #{color_1};
                */
            }}
            """.format(
                color_1 = program.color_1,
                color_2 = program.color_2
            )
        )

        self.menu.setStyleSheet(
            """
            QMenu{{
                color: #{color_1};
                background-color: #{color_2};
                /*
                border: 1px solid #{color_1};
                */
            }}
            QMenu::item{{
                color: #{color_1};
                background-color: #{color_2};
                /*
                border: 1px solid #{color_1};
                */
            }}
            QMenu::item::selected{{
                color: #{color_2};
                background-color: #{color_1};
                /*
                border: 1px solid #{color_1};
                */
            }}
            """.format(
                color_1 = program.color_1,
                color_2 = program.color_2
            )
        )

        self.button_menu.setStyleSheet(
            """
            QPushButton{{
                color: #{color_1};
                background-color: #{color_2};
                border: none;
                margin: 0px;
                padding: 0px;
            }}
            QPushButton:pressed{{
                color: #{color_1};
                background-color: #{color_2};
                border: none;
                margin: 0px;
                padding: 0px;
            }}
            """.format(
                color_1 = program.color_1,
                color_2 = program.color_2
            )
        )

        if program.set_always_on_top is True:
            self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
        if program.window_frame is False:
            self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        if program.set_position is True:
            self.move(0, 0)
        self.resize(QtGui.QDesktopWidget().screenGeometry().width(), 15)

        thread_percentage_power = threading.Thread(
            target = self.percentage_power
        )
        thread_percentage_power.daemon = True
        thread_percentage_power.start()

        thread_clock = threading.Thread(
            target = self.clock
        )
        thread_clock.daemon = True
        thread_clock.start()

        self.show()

    def process_menu(
        self,
        action
        ):
        action_text = action.text()
        if action_text == "Openbox Configuration Manager":
            shijian.engage_command("obconf")
        if action_text == "unity-control-center":
            shijian.engage_command("unity-control-center")
        if action_text == "close panel":
            program.terminate()
        if action_text == "suspend":
            shijian.engage_command("systemctl suspend")
        if action_text == "hibernate":
            shijian.engage_command("systemctl hibernate")
        if action_text == "reboot":
            shijian.engage_command("systemctl reboot")
        if action_text == "shut down":
            shijian.engage_command("systemctl poweroff")

    def percentage_power(
        self
        ):
        while True:
            percentage_power = shijian.percentage_power()
            if percentage_power is None:
                percentage_power = "100%"
            self.indicator_percentage_power.setText(
                percentage_power
            )
            time.sleep(30)

    def clock(
        self
        ):
        while True:
            self.indicator_clock.setText(
                shijian.time_UTC(
                    style = "YYYY-MM-DD HH:MM:SS UTC"
                )
            )
            time.sleep(1)

if __name__ == "__main__":
    options = docopt.docopt(__doc__)
    if options["--version"]:
        print(programVersion)
        exit()
    main(options)

2 ответа

Без вывода журнала openbox, в котором будет показано, что произошло при запуске скрипта, маловероятно, что вы сможете получить ответ. Это может быть проблема пути, проблема пути к библиотекам, проблема с разрешениями, проблема с уровнем безопасности и т. Д.

Вот несколько вещей, которые можно попробовать:

  • Найти вывод журнала openbox; Возможно, вам придется активировать его.
  • Также может быть тестовый режим для openbox, где вы можете вызвать openbox из командной строки в окне оболочки; тогда вы можете увидеть, если вы получите какой-либо консольный вывод там.
  • Записать вывод вашей команды в файл и проверить, что находится в нем после запуска автозапуска openbox:

    your_command >$HOME/openbox_log 2>&1 &
    
  • Поместите вашу команду в скрипт и вызывайте ее из автозапуска вместо запуска python с командными аргументами (это длинный путь, но стоит попробовать)

Было бы более полезно, если бы вы опубликовали свой autostartТаким образом, мы могли бы взглянуть и искать решение. Так как вы этого не сделали, я сделаю предположение здесь. Вы разместили свои команды последовательно на autostart без & в конце каждой команды.

Так когда autostart работает /usr/bin/python /usr/share/test/test.pyБуду висеть, ожидая test.py закончить, прежде чем он сможет бежать /usr/bin/python /usr/share/test/ucom-panel.py, Я подозреваю, что если вы добавите & до конца каждой из ваших команд они ушли работать как вы ожидали.

& говорит оболочке выполнить команду в фоновом режиме и перейти к следующей команде.

Я предлагаю вам откат /etc/X11/openbox/autostart к тому, что было раньше, и вместо этого отредактируйте /home/<username>/.config/openbox/autostart, как это:

#!/bin/sh
/usr/bin/python /usr/share/test/test.py &
/usr/bin/python /usr/share/test/ucom-panel.py &
Другие вопросы по тегам