Как загрузить только собственный скрипт Python (GUI)?


12

У меня есть следующая проблема: Использование 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.


Я признаю, что это не очень помогает, но, может быть, стоит посмотреть, как, например, загружается XBMC (или другой HTPC dicrtibution)? В качестве альтернативы, возможно, это ответило бы на ваш вопрос raspberrypi.stackexchange.com/questions/11866/…
Петр Гладких

Ответы:


12

В течение последнего месяца или около того я работал над практически одной и той же вещью, поэтому я исследовал, как это сделать, и знаю, как это сделать с последней версией 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 в случае сбоя):

#!/usr/bin/env bash
exec openbox-session &
while true; do
  python3 /home/pi/Documents/script.py
done

и это должно быть все, что нужно, я думаю. Я написал скрипт Bash, чтобы настроить это автоматически:

sudo apt-get -y install nodm

# Edit nodm config file
sudo sed -i -e "s/NODM_ENABLED=false/NODM_ENABLED=true/" -e "s/NODM_USER=root/NODM_USER=pi/" \
  /etc/default/nodm

# Create custom Xsession file
printf "%s\n" \
  "#!/usr/bin/env bash" \
  "exec openbox-session &" \
  "while true; do" \
  "  python3 $PWD/main.py" \
  "done" \
  > /home/pi/.xsession

Примечания:

  • Я нашел эту ссылку полезной, но некоторая информация устарела: https://blog.qruizelabs.com/2014/04/29/raspberrypi-kiosk-matchbox-uzbl/ Они используют менеджер окон Matchbox, который не работает для меня, потому что мне нужна поддержка нескольких окон, но это может быть хорошим вариантом, если вы этого не сделаете.
  • Решение, приведенное выше, сработало, но я хотел, чтобы среда была как можно более легкой, поэтому я перешел на Raspbian Lite, который не имеет графического интерфейса и начал с нуля только установив пакеты, которые абсолютно необходимы. Процесс очень похож, но в дополнение к nodmвам нужно установить xserver-xorg, xinit, openboxи любые другие зависимости ваш скрипт. Затем, если вы используете Openbox, вместо запуска скрипта Python в файле Xsession, часть кода, который его запускает, необходимо перенести в отдельный скрипт ( /home/pi/.config/openbox/autostart). Я могу подробнее рассказать о том, как сделать это при желании.

Привет tjohnson, я использовал метод, который ты описал выше на Raspbian, и заставил его работать, спасибо! Я хотел попробовать в Raspbian Lite, также вы упомянули в своей последней заметке. Я установил дополнительные зависимости, которые вы перечислили, но приложение не запустилось. Я предполагаю, что это связано с вашим последним комментарием о переносе этого в отдельный скрипт. У меня нет папки home / pi / .config / openbox, поэтому я создал ее и файл автозапуска, но, похоже, он не работает. Не могли бы вы уточнить это? Спасибо
AngeloQ

@AngeloQ вы работали над Raspbian Lite?
Павел

1

Файл автозапуска существует в нескольких разных местах. Это просто вопрос редактирования правильного файла автозапуска по правильному пути. Я пытался редактировать /home/pi/.config/lxsession/LXDE-pi/autostart. Это, наконец, добилось цели для меня.

/etc/xdg/lxsession/LXDE-pi/autostart кажется, неправильный путь.


0

Подвох я использовал на RPi в прошлом было поставить команды в моем /etc/rc.localфайле непосредственно перед exit 0линией. В вашем случае я бы попробовал следующую строку и перезагрузился.

python /full/path/to/file.py &

Поскольку вы заявили, что требуются разрешения уровня sudo, вам, возможно, придется вместо этого настроить suкоманду, которую вы ранее пробовали, потому что сейчас похоже, что вы пытаетесь запустить под piпользователем.

Одно предупреждение о моём предложении об использовании файла rc.local: если ваш скрипт завершает работу с ненулевым статусом, вы не завершите загрузку, поэтому для большей безопасности во время тестов вы можете попробовать следующее, чтобы последующий выход по-прежнему равнялся 0

python /full/path/to/file.py & || exit 0

Правки и обновления

Просматривая некоторые данные поиска, нашел инструктивный материал , демонстрирующий использование сценария запуска, на который есть ссылка во вкладке cron, для облегчения загрузки сценариев Python. Может показаться, что загрузка cron для загрузки скрипта sh / bash для загрузки python кажется довольно сложной, но ... она достаточно сложна, чтобы придать ей некоторый извращенный смысл.


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Ганима

0

Таким образом, в зависимости от того, какие входные данные нужны вашему коду, это решение может работать.

Первым делом я сделал скрипт в моей директории /, который выглядит так:

#!/bin/bash
echo "Starting program..."
cd /home/pi/myFolder
sudo python3 myPython.py $@ #$@ takes all arguments and passes them to python.
exit 0

Вы должны сделать это работоспособным с chmod -x scriptName.sh.

Затем сделать crontab -eв терминале и добавить@reboot sudo bash /scriptName.sh

Установите опцию загрузки на CLI, и все будет хорошо! Это сработало на моем 3B под управлением Raspbian.

Одно предостережение: если вы используете сенсорный экран для своего киоска / экрана, я еще не понял этого. Он будет хорошо работать с вводом с помощью мыши, но что касается сенсорного ввода, по крайней мере для экрана, который я пытаюсь использовать, он будет отключен таким образом, что делает его непригодным для использования.

Примечание . Если ваш код выполняет файловый ввод-вывод, подобный моему, вы должны использовать его cdдля перехода к расположению вашего кода в скрипте запуска, или python будет предполагать, что он находится в том же месте, что и ваш скрипт, и соответственно будет выполнять файловый ввод-вывод.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.