У меня есть следующая проблема: Использование RaspPi 3B под управлением Raspbian Jessie (версия 4.4.26-v7 +) Я хотел бы, чтобы GUI самописного скрипта Python выполнялся при запуске.
Я знаю, что этот вопрос задавался как на этом веб-сайте, так и на других, но поскольку Raspbian постоянно меняется, и ни одно из предложенных ранее решений не помогло мне (см. Ниже), я хотел бы задать его еще раз.
Насколько я понимаю, мне нужно загрузить XServer и впоследствии выполнить мой скрипт. Это должно происходить вместо загрузки всего рабочего стола.
Предполагается, что одним из способов достижения этого является использование файла автозапуска LXDE (как указано в этом ответе ). Я отредактировал файл /etc/xdg/lxsession/LXDE-pi/autostart
так же, как и файл /etc/xdg/lxsession/LXDE/autostart
(первый изначально содержал четыре строки вместо трех, как было предложено в посте, на который есть ссылки) - добавив строки @sudo python /full/path/to/file.py
и @openbox
, но мой Pi по-прежнему загружается на рабочий стол и вообще не выполняет сценарий автоматически. Аннотация: я пробовал только строку сценария и строку сценария вместе со строкой openbox для одного из файлов и для обоих файлов вместе.
Другая стратегия включает файл rc.local (как предлагается в официальной документации ). Однако, только добавление python /full/path/to/file.py &
не работало (так как мой GUI все еще отсутствовал), и дальнейшее добавление startx
не помогло, так как я, очевидно, не мог связать startx со скриптом python, и поэтому первый закрылся сразу после его запуска.
Некоторые предполагают , что (дополнительно) .xinitrc следует использовать. Это, однако, тоже не сработало:
su -c python /full/path/to/file.py pi
И, наконец, что не менее важно, в некотором смысле, это должно быть выполнимо с помощью init.d - но я пока не нашел подробностей об этом.
Я был бы очень признателен за любой намек в правильном направлении. Где моя ошибка? Как должна выглядеть моя строка в rc.local или .xinitrc? Или произошли серьезные изменения, связанные с переходом на пиксель, и я должен попробовать что-то еще?
Некоторая дополнительная информация: скрипту нужны права sudo. Он написан на Python 2.7, графический интерфейс использует Tkinter. Графический интерфейс полностью заполняет экран, поэтому фоны не имеют значения. Сценарий должен работать вечно (или до тех пор, пока он не будет остановлен пользовательским вводом через графический интерфейс) и использует системные службы, такие как wifi и ethernet.
Больше информации: все происходит локально.
Пояснение: к настоящему времени я потратил более 8 часов на поиск в сети, пробуя учебные пособия из разных начальных точек или смешивая их вместе. Я пришел к выводу, что либо мой скрипт (который отлично работает при запуске в пикселях) не работает, если он запускается не в среде рабочего стола (в чем я сомневаюсь), или что необходим новый учебник, потому что октябрь 2016 года меняется на Raspbian сделал любые старые уроки устаревшими. Кроме того, проблема заключается не в том, чтобы запустить скрипт или запустить Xserver (или что-то похожее) независимо друг от друга, а в том, чтобы сделать обе ссылки связанными, чтобы скрипт использовал отображение, созданное Xserver.
Ответы:
В течение последнего месяца или около того я работал над практически одной и той же вещью, поэтому я исследовал, как это сделать, и знаю, как это сделать с последней версией Raspbian (PIXEL).
nodm
является минимальным диспетчером отображения, который обходит загрузку LXDE иopenbox
(который уже установлен на Pi) предоставляет минимальный менеджер сеансов и работает с X-сервером.Для того, чтобы создать эту среду в Raspbian, установить
nodm
сapt-get
и редактировать файл/etc/default/nodm
. Вы должны установить опциюNODM_ENABLED
вtrue
иNODM_USER
кpi
(или то , что ваше имя пользователя).Затем создайте пользовательский файл Xsession в вашей домашней папке (
/home/pi/.xsession
) со следующим содержимым (while
цикл не нужен, он просто автоматически перезапускает скрипт Python в случае сбоя):и это должно быть все, что нужно, я думаю. Я написал скрипт Bash, чтобы настроить это автоматически:
Примечания:
nodm
вам нужно установитьxserver-xorg
,xinit
,openbox
и любые другие зависимости ваш скрипт. Затем, если вы используете Openbox, вместо запуска скрипта Python в файле Xsession, часть кода, который его запускает, необходимо перенести в отдельный скрипт (/home/pi/.config/openbox/autostart
). Я могу подробнее рассказать о том, как сделать это при желании.источник
Файл автозапуска существует в нескольких разных местах. Это просто вопрос редактирования правильного файла автозапуска по правильному пути. Я пытался редактировать
/home/pi/.config/lxsession/LXDE-pi/autostart
. Это, наконец, добилось цели для меня./etc/xdg/lxsession/LXDE-pi/autostart
кажется, неправильный путь.источник
Подвох я использовал на RPi в прошлом было поставить команды в моем
/etc/rc.local
файле непосредственно передexit 0
линией. В вашем случае я бы попробовал следующую строку и перезагрузился.Поскольку вы заявили, что требуются разрешения уровня sudo, вам, возможно, придется вместо этого настроить
su
команду, которую вы ранее пробовали, потому что сейчас похоже, что вы пытаетесь запустить подpi
пользователем.Одно предупреждение о моём предложении об использовании файла rc.local: если ваш скрипт завершает работу с ненулевым статусом, вы не завершите загрузку, поэтому для большей безопасности во время тестов вы можете попробовать следующее, чтобы последующий выход по-прежнему равнялся 0
Правки и обновления
Просматривая некоторые данные поиска, нашел инструктивный материал , демонстрирующий использование сценария запуска, на который есть ссылка во вкладке cron, для облегчения загрузки сценариев Python. Может показаться, что загрузка cron для загрузки скрипта sh / bash для загрузки python кажется довольно сложной, но ... она достаточно сложна, чтобы придать ей некоторый извращенный смысл.
источник
Таким образом, в зависимости от того, какие входные данные нужны вашему коду, это решение может работать.
Первым делом я сделал скрипт в моей директории /, который выглядит так:
Вы должны сделать это работоспособным с
chmod -x scriptName.sh
.Затем сделать
crontab -e
в терминале и добавить@reboot sudo bash /scriptName.sh
Установите опцию загрузки на CLI, и все будет хорошо! Это сработало на моем 3B под управлением Raspbian.
Одно предостережение: если вы используете сенсорный экран для своего киоска / экрана, я еще не понял этого. Он будет хорошо работать с вводом с помощью мыши, но что касается сенсорного ввода, по крайней мере для экрана, который я пытаюсь использовать, он будет отключен таким образом, что делает его непригодным для использования.
Примечание . Если ваш код выполняет файловый ввод-вывод, подобный моему, вы должны использовать его
cd
для перехода к расположению вашего кода в скрипте запуска, или python будет предполагать, что он находится в том же месте, что и ваш скрипт, и соответственно будет выполнять файловый ввод-вывод.источник