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/autostart
jak 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.py
i @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 startx
nie 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.
Odpowiedzi:
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).
nodm
to minimalny menedżer wyświetlania, który omija ładowanie LXDE, iopenbox
(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ć
nodm
zapt-get
i edytować plik/etc/default/nodm
. Trzeba ustawić opcjęNODM_ENABLED
, abytrue
iNODM_USER
dopi
(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ą (while
pętla nie jest konieczna, po prostu automatycznie uruchamia skrypt Python, jeśli ulegnie awarii):i myślę, że powinno to być wszystko, co konieczne. Napisałem skrypt Bash, aby ustawić to automatycznie:
Uwagi:
nodm
trzeba zainstalowaćxserver-xorg
,xinit
,openbox
oraz 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ć.źródło
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ą.źródło
Trik brudny Użyłem na RPI w przeszłości było umieszczenie polecenia w moim
/etc/rc.local
pliku tuż przedexit 0
linią. W twoim przypadku wypróbuję następującą linię i uruchomię ponownie.Jak już powiedziałeś, że potrzebne są uprawnienia na poziomie sudo, być może będziesz musiał zmienić
su
polecenie, które wcześniej wypróbowałeś, ponieważ teraz wygląda na to, że próbujesz uruchomićpi
uż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
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.
źródło
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:
Musisz to zrobić
chmod -x scriptName.sh
.Następnie zrób
crontab -e
w 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ć,
cd
aby 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.źródło