Як завантажуватися тільки у власний скрипт python (GUI)?


12

У мене є така проблема: Використовуючи RaspPi 3B під управлінням Raspbian Jessie (версія 4.4.26-v7 +), я хотів би, щоб графічний інтерфейс самостійно написаного 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 &не спрацювало (оскільки досі мій графічний інтерфейс відсутній), а подальше додавання startxне допомогло, оскільки я, мабуть, не зміг зв’язати старткс із сценарієм python, і тому попередній закрився одразу після його запуску.

Деякі припускають , що (додатково) .xinitrc слід використовувати. Однак це також не спрацювало:

su -c python /full/path/to/file.py pi

І, нарешті, але не в останню чергу, якимось чином це можна зробити за допомогою init.d - але я поки не знайшов деталей щодо цього.

Я дуже вдячний за будь-який натяк на правильний напрямок. Де моя помилка? Як має виглядати мій рядок у rc.local чи .xinitrc? Або відбулися серйозні зміни, пов'язані з переходом на піксель, і я повинен спробувати щось інше?


Деякі додаткові відомості: сценарію потрібні права судо. Він написаний на Python 2.7, GUI використовує Tkinter. GUI заповнює екран повністю, тому фони не мають значення. Сценарій повинен працювати вічно (або доти, доки він не зупиниться введенням користувача через GUI) і не використовує системні сервіси, такі як wifi та Ethernet.


Більше інформації: Все відбувається на місцях.


Уточнення: На даний момент я провів більше 8 годин на пошуках мережі, пробуючи підручники з різних вихідних точок або змішуючи їх разом. Я прийшов до висновку, що або мій скрипт (який прекрасно працює при запуску в пікселі) не працює, якщо запускається в не робочому середовищі (в чому я сумніваюся), або що потрібен новий підручник, оскільки жовтень 2016 року змінюється на Raspbian зробив будь-які старі підручники застарілими. Крім того, завдання полягає не в тому, щоб запустити скрипт або запустити Xserver (або щось подібне) незалежно один від одного, а в тому, щоб зробити обидва пов'язані, щоб сценарій використовував дисплей, створений Xserver.


Я визнаю, що це не дуже допомагає, але, можливо, варто подивитися, як, наприклад, чоботи XBMC (або інші диспетчеризації HTPC)? Або, можливо, це відповість на ваше запитання 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(або як би це було ваше ім’я користувача).

Потім створіть у домашній папці ( /home/pi/.xsession) спеціальний файл 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, яку ви також згадали у своїй останній записці. Я встановив перелічені вами додаткові залежності, але додаток не запускався. Я припускаю, що це пов'язано з вашим останнім коментарем щодо переміщення цього сценарію до окремого сценарію. У мене немає домашньої папки / 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, але ... це достатньо вивернуте, щоб мати певний кручений сенс.


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Ghanima

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.

Одне застереження, якщо ви використовуєте сенсорний екран для свого кіоску / екрану, я ще не повинен це розібратися. Він буде добре працювати з введенням миші, але що стосується сенсорного введення, принаймні для екрана, який я намагаюся використовувати, він буде вимкнений таким чином, що робить його непридатним.

Примітка : Якщо ваш код робить файл IO, як мій, ви повинні використовувати cdдля переходу до місця свого коду в вашому запуску скрипт, або python буде вважати, що його розташування є місцем вашого сценарію, і буде виконувати IO файлу відповідно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.