Jak uruchomić tylko własny skrypt Pythona (GUI)?

12

Mam następujący problem: Używając RaspPi 3B z systemem Raspbian Jessie (wersja 4.4.26-v7 +) Chciałbym, aby GUI napisanego przez siebie skryptu pythonowego było uruchamiane podczas uruchamiania.

Wiem, że to pytanie zostało zadane na tej stronie, a także na innych, ale ponieważ Raspbian ciągle się zmienia i żadne z zaproponowanych wcześniej rozwiązań nie działało dla mnie (patrz poniżej), chciałbym je zadać ponownie.

Z mojego rozumienia muszę załadować XServer i wykonać skrypt później. Powinno to się zdarzyć zamiast ładowania całego pulpitu.

Jednym ze sposobów osiągnięcia tego jest użycie pliku autostartu LXDE (jak opisano w tej odpowiedzi ). Edytowałem zarówno plik, /etc/xdg/lxsession/LXDE-pi/autostartjak i plik /etc/xdg/lxsession/LXDE/autostart(poprzednio pierwotnie zawierały cztery wiersze zamiast trzech, jak sugerowano w cytowanym poście) - dodając wiersze @sudo python /full/path/to/file.pyi @openbox, ale moje Pi nadal uruchamia się na pulpicie i w ogóle nie wykonuje skryptu. Adnotacja: wypróbowałem tylko wiersz skryptu i wiersz skryptu wraz z wierszem openbox dla jednego z plików i dla obu plików razem.

Inna strategia obejmuje plik rc.local (jak sugeruje oficjalna dokumentacja ). Jednak tylko dodawanie python /full/path/to/file.py &nie działało (ponieważ nadal brakowało mojego GUI), a dalsze dodawanie startxnie pomogło, ponieważ najwyraźniej nie mogłem połączyć startx ze skryptem Pythona, a zatem ten pierwszy został zamknięty natychmiast po uruchomieniu.

Niektórzy sugerują , że należy (dodatkowo) użyć xinitrc. To jednak nie zadziałało:

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

I wreszcie, w jakiś sposób, powinno to być wykonalne przy użyciu init.d - ale jeszcze nie znalazłem szczegółów na ten temat.

Byłbym naprawdę wdzięczny za wszelkie wskazówki w dobrym kierunku. Gdzie jest mój błąd? Jak powinna wyglądać moja linia w rc.local lub .xinitrc? A może nastąpiły poważne zmiany związane z przejściem na piksel i powinienem spróbować czegoś innego?


Kilka dodatkowych informacji: skrypt wymaga uprawnień sudo. Jest napisany w Pythonie 2.7, GUI używa Tkintera. GUI wypełnia ekran całkowicie, więc tła nie mają znaczenia. Skrypt powinien działać wiecznie (lub dopóki nie zostanie zatrzymany przez użytkownika za pośrednictwem GUI) i korzysta z usług systemowych, takich jak Wi-Fi i Ethernet.


Więcej informacji: Wszystko dzieje się lokalnie.


Wyjaśnienie: Do tej pory spędziłem ponad 8 godzin na przeszukiwaniu sieci, testowaniu samouczków z różnych punktów początkowych lub mieszaniu ich razem. Doszedłem do wniosku, że albo mój skrypt (który działa idealnie po uruchomieniu w pikselach) nie działa, jeśli jest uruchamiany w środowisku innym niż stacjonarne (w co wątpię) lub że potrzebny jest nowy samouczek, ponieważ w październiku 2016 r. Zmieniono na Raspbian wszystkie starsze samouczki stały się przestarzałe. Co więcej, wyzwanie nie polega na uruchomieniu skryptu lub uruchomieniu Xserver (lub czegoś podobnego) niezależnie od siebie, ale na zrobieniu obu połączonych, aby skrypt używał ekranu stworzonego przez Xserver.

Fantilein1990
źródło
Przyznaję, że to niewiele pomaga, ale może warto przyjrzeć się, jak np. XBMC (lub inny dyktafon HTPC) się uruchamia? Ewentualnie może to odpowiedzieć na twoje pytanie raspberrypi.stackexchange.com/questions/11866/...
Petr Gladkikh

Odpowiedzi:

12

Przez mniej więcej miesiąc pracowałem nad dokładnie tą samą rzeczą, więc dużo badałem, jak to zrobić i wiem, jak to zrobić w najnowszej wersji Raspbian (PIXEL).

nodmto minimalny menedżer wyświetlania, który omija ładowanie LXDE, i openbox(który jest już zainstalowany na Pi) zapewnia minimalny menedżer sesji i współpracuje z serwerem X.

Aby skonfigurować to środowisko w Raspbian, zainstalować nodmz apt-geti edytować plik /etc/default/nodm. Trzeba ustawić opcję NODM_ENABLED, aby truei NODM_USERdo pi(lub cokolwiek nazwa użytkownika jest).

Następnie utwórz niestandardowy plik Xsession w folderze domowym ( /home/pi/.xsession) z następującą zawartością ( whilepętla nie jest konieczna, po prostu automatycznie uruchamia skrypt Python, jeśli ulegnie awarii):

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

i myślę, że powinno to być wszystko, co konieczne. Napisałem skrypt Bash, aby ustawić to automatycznie:

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

Uwagi:

  • Uznałem ten link za pomocny, ale niektóre informacje są już nieaktualne: https://blog.qruizelabs.com/2014/04/29/raspberrypi-kiosk-matchbox-uzbl/ Używają menedżera okien Matchbox, który nie działał dla mnie, ponieważ potrzebowałem obsługi wielu okien, ale może to być dobra opcja, jeśli nie.
  • Powyższe rozwiązanie działało, ale chciałem mieć środowisko tak lekkie, jak to możliwe, więc przełączyłem się na Raspbian Lite, który nie ma GUI i zacząłem od zera, instalując tylko pakiety, które są absolutnie konieczne. Proces ten jest bardzo podobny, ale dodatkowo nodmtrzeba zainstalować xserver-xorg, xinit, openboxoraz wszelkie inne zależności Twój skrypt. Następnie, jeśli używasz Openbox, zamiast uruchamiać skrypt Python w pliku Xsession, część kodu, który go uruchamia, musi zostać przeniesiona do osobnego skryptu ( /home/pi/.config/openbox/autostart). W razie potrzeby mogę rozwinąć więcej informacji na temat tego, jak to zrobić.
tjohnson
źródło
Cześć, tjohnson, użyłem metody opisanej powyżej na Raspbian i sprawiłem, że działała, dziękuję! Chciałem spróbować Raspbian Lite, o którym wspomniałeś w ostatniej notatce. Zainstalowałem dodatkowe zależności, które wymieniłeś, ale aplikacja się nie uruchomiła. Zakładam, że ma to związek z twoim ostatnim komentarzem na temat przeniesienia go do osobnego skryptu. Nie mam folderu home / pi / .config / openbox, więc utworzyłem go i plik autostartu, ale wydaje się, że nie działa. Czy mógłbyś rozwinąć tę kwestię? Dzięki
AngeloQ,
@AngeloQ, czy udało ci się uruchomić Raspbian Lite?
Paul
1

Plik autostartu istnieje w kilku różnych miejscach. Jest to po prostu kwestia edycji odpowiedniego pliku autostartu we właściwej ścieżce. Próbowałem edytować /home/pi/.config/lxsession/LXDE-pi/autostart. To w końcu załatwiło sprawę.

/etc/xdg/lxsession/LXDE-pi/autostart wydaje się być złą drogą.

Nylesteiner
źródło
0

Trik brudny Użyłem na RPI w przeszłości było umieszczenie polecenia w moim /etc/rc.localpliku tuż przed exit 0linią. W twoim przypadku wypróbuję następującą linię i uruchomię ponownie.

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

Jak już powiedziałeś, że potrzebne są uprawnienia na poziomie sudo, być może będziesz musiał zmienić supolecenie, które wcześniej wypróbowałeś, ponieważ teraz wygląda na to, że próbujesz uruchomić piużytkownika.

Jedno ostrzeżenie o mojej sugestii użycia pliku rc.local, jeśli skrypt zakończy działanie z niezerowym statusem, nie dokończysz rozruchu, więc aby być bezpieczniejszym podczas testów, możesz spróbować wykonać następujące czynności, aby upewnić się, że wyjście jest równe 0

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

Edycje i aktualizacje

Przeglądając niektóre dane wyszukiwania, znalazłem instruowalny, który demonstruje użycie skryptu uruchamiania, do którego odwołuje się karta cron, aby ułatwić ładowanie skryptów python. Może się wydawać, że ładuje crona w celu załadowania skryptu sh / bash w celu załadowania Pythona, ale ... jest wystarczająco skomplikowany, aby mieć jakiś przekręcony sens.

S0AndS0
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Ghanima
0

W zależności od tego, jakiego kodu wymaga Twój kod, to rozwiązanie może działać.

Pierwszą rzeczą, którą zrobiłem, było stworzenie skryptu w moim katalogu /, który wygląda następująco:

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

Musisz to zrobić chmod -x scriptName.sh.

Następnie zrób crontab -ew terminalu i dodaj@reboot sudo bash /scriptName.sh

Ustaw opcję rozruchu na CLI i powinieneś być gotowy! To działało na moim 3B z systemem Raspbian.

Jedno zastrzeżenie, jeśli używasz ekranu dotykowego w swoim kiosku / ekranie, muszę go jeszcze rozgryźć. Będzie działał dobrze z wprowadzaniem za pomocą myszy, ale co do wprowadzania dotykowego, przynajmniej dla ekranu, którego próbuję użyć, będzie wyłączony w sposób, który uniemożliwi korzystanie z niego.

Uwaga : Jeśli Twój kod wykonuje operacje wejścia / wyjścia pliku tak jak moje, musisz użyć, cdaby przejść do lokalizacji kodu w skrypcie uruchamiającym, w przeciwnym razie Python przyjmie lokalizację tego skryptu i odpowiednio wykona operację wejścia / wyjścia pliku.

Alexzoin
źródło