Come avviare solo nel proprio script Python (GUI)?


12

Ho il seguente problema: Utilizzando un RaspPi 3B con Raspbian Jessie (versione 4.4.26-v7 +), vorrei che la GUI di uno script Python scritto da solo fosse eseguita all'avvio.

So che questa domanda è stata posta su questo sito Web e su altri, ma poiché Raspbian continua a cambiare e nessuna delle soluzioni suggerite prima ha funzionato per me (vedi sotto), vorrei farle di nuovo.

Da quanto ho capito, devo caricare XServer ed eseguire successivamente il mio script. Questo dovrebbe accadere invece di caricare l'intero desktop.

Un modo per raggiungere questo obiettivo dovrebbe essere tramite il file di avvio automatico LXDE (come indicato in questa risposta ). Ho modificato sia il file /etc/xdg/lxsession/LXDE-pi/autostartche il file /etc/xdg/lxsession/LXDE/autostart(il primo conteneva originariamente quattro righe anziché tre come suggerito nel post di riferimento) - aggiungendo le righe @sudo python /full/path/to/file.pye @openbox, ma il mio Pi si avvia ancora sul desktop e non esegue automaticamente lo script. Annotazione: ho provato solo la riga di script e la riga di script insieme alla riga openbox per uno dei file e per entrambi i file insieme.

Un'altra strategia prevede il file rc.local (come suggerito nella documentazione ufficiale ). Tuttavia, solo l'aggiunta python /full/path/to/file.py &non ha funzionato (poiché mancava ancora la mia GUI) e l'ulteriore aggiunta startxnon mi ha aiutato poiché apparentemente non riuscivo a collegare lo startx con lo script Python e il primo quindi si chiudeva immediatamente dopo l'avvio.

Alcuni suggeriscono che dovrebbe essere usato (in aggiunta) .xinitrc. Questo, tuttavia, non ha funzionato neanche:

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

E, ultimo ma non meno importante, in qualche modo, dovrebbe essere fattibile usando init.d - ma non ho ancora trovato dettagli su questo.

Gradirei davvero qualsiasi suggerimento verso la giusta direzione. Dov'è il mio errore? Come dovrebbe essere la mia linea in rc.local o .xinitrc? O ci sono stati cambiamenti importanti legati al passaggio al pixel e dovrei provare qualcos'altro?


Alcune informazioni aggiuntive: lo script necessita dei diritti sudo. È scritto in Python 2.7, la GUI utilizza Tkinter. La GUI riempie completamente lo schermo, quindi gli sfondi sono irrilevanti. Lo script dovrebbe essere eseguito per sempre (o fino a quando non viene interrotto dall'input dell'utente attraverso la GUI) e utilizza servizi di sistema come wifi ed Ethernet.


Ulteriori informazioni: tutto sta accadendo localmente.


Chiarimento: ormai ho trascorso più di 8 ore a cercare in rete, provando tutorial da diversi punti di partenza o mescolandoli insieme. Sono giunto alla conclusione che il mio script (che funziona perfettamente all'avvio in pixel) non funziona se eseguito in un ambiente non desktop (di cui dubito) o che è necessario un nuovo tutorial, perché l'ottobre 2016 cambia in Raspbian ha reso obsoleti tutti i tutorial più vecchi. Inoltre, la sfida non sta nell'avvio dello script o nell'avvio di Xserver (o qualcosa di simile) indipendentemente l'uno dall'altro, ma nel fare entrambi i collegamenti in modo che lo script utilizzi il display creato da Xserver.


Ammetto che non è di grande aiuto, ma forse vale la pena guardare come ad esempio XBMC (o altri dicrtibution HTPC) si avvia? In alternativa, forse questo risponderebbe alla tua domanda raspberrypi.stackexchange.com/questions/11866/…
Petr Gladkikh

Risposte:


12

Nell'ultimo mese ho lavorato praticamente sulla stessa identica cosa, quindi ho studiato molto come farlo e sapere come farlo con l'ultima versione di Raspbian (PIXEL).

nodmè un display manager minimo che bypassa il caricamento di LXDE e openbox(che è già installato sul Pi) fornisce un gestore di sessioni minimo e funziona con il server X.

Per configurare questo ambiente in Raspbian, installare nodmcon apt-gete modificare il file /etc/default/nodm. Devi impostare l'opzione NODM_ENABLEDsu truee NODM_USERsu pi(o qualunque sia il tuo nome utente).

Quindi crea un file Xsession personalizzato nella tua cartella home ( /home/pi/.xsession) con i seguenti contenuti (il whileciclo non è necessario, riavvia automaticamente lo script Python in caso di arresto anomalo):

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

e questo dovrebbe essere tutto ciò che è necessario penso. Ho scritto uno script Bash per configurarlo automaticamente:

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

Appunti:

  • Ho trovato utile questo link, ma alcune delle informazioni ora non sono aggiornate: https://blog.qruizelabs.com/2014/04/29/raspberrypi-kiosk-matchbox-uzbl/ Usano il gestore di finestre Matchbox, che non ha funzionato per me perché avevo bisogno del supporto di più finestre, ma potrebbe essere una buona opzione se non lo fai.
  • La soluzione sopra ha funzionato, ma volevo un ambiente il più leggero possibile, quindi sono passato a Raspbian Lite che non ha una GUI e ho iniziato da zero installando solo i pacchetti assolutamente necessari. Il processo è abbastanza simile, ma oltre a nodmè necessario installare xserver-xorg, xinit, openbox, ed eventuali altre dipendenze Lo script è. Quindi se stai usando Openbox, invece di eseguire lo script Python nel file Xsession, la parte del codice che lo esegue deve essere spostata in uno script separato ( /home/pi/.config/openbox/autostart). Posso approfondire come fare questo, se lo si desidera.

Ciao tjohnson, ho usato il metodo che hai descritto sopra su Raspbian e l'ho fatto funzionare, grazie! Volevo provare a fare Raspbian Lite anche tu menzionato nella tua ultima nota. Ho installato le dipendenze extra che hai elencato ma l'app non è stata avviata. Presumo che sia correlato al tuo ultimo commento sul passaggio a uno script separato. Non ho una cartella home / pi / .config / openbox, quindi l'ho creata e il file di avvio automatico, ma non sembra funzionare. Potresti per favore approfondire questo? Grazie
AngeloQ,

@AngeloQ sei riuscito a farlo funzionare su Raspbian Lite?
Paul

1

Il file di avvio automatico esiste in diversi luoghi. Si tratta semplicemente di modificare il file di avvio automatico corretto nel percorso corretto. Ho provato a modificare /home/pi/.config/lxsession/LXDE-pi/autostart. Questo alla fine ha fatto il trucco per me.

/etc/xdg/lxsession/LXDE-pi/autostart sembra essere la strada sbagliata.


0

Il trucco sporco che ho usato su RPi in passato era inserire comandi nel mio /etc/rc.localfile appena prima della exit 0riga. Nel tuo caso, proverei la riga seguente e riavvio.

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

Come hai affermato che sono necessarie le autorizzazioni a livello di sudo, potresti dover modificare il sucomando che hai già provato perché in questo momento sembra che tu stia cercando di eseguire sotto l' piutente.

Un avvertimento sul mio suggerimento sull'uso del file rc.local, se lo script esce con uno stato diverso da zero non completerai l'avvio, quindi per essere più sicuro durante i test puoi provare quanto segue per far sì che exit sia ancora uguale a 0

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

Modifiche e aggiornamenti

Guardando anche se alcuni dati di ricerca, ha trovato un instructable che illustra l'utilizzo di uno script lanciatore fa riferimento nella scheda cron per facilitare script python di carico. Può sembrare in procinto di caricare cron per caricare uno script sh / bash al fine di caricare Python ma ... è abbastanza contorto da dare un senso contorto.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Ghanima

0

Pertanto, a seconda dell'input richiesto dal codice, questa soluzione potrebbe funzionare.

La prima cosa che ho fatto è stato creare uno script nella mia directory / che sia così:

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

Devi renderlo gestibile con chmod -x scriptName.sh.

Quindi esegui crontab -enel terminale e aggiungi@reboot sudo bash /scriptName.sh

Imposta l'opzione di avvio su CLI e dovresti essere pronto! Questo ha funzionato sul mio 3B con Raspbian.

Un avvertimento, se stai usando un touchscreen per il tuo chiosco / schermo non ho ancora capito. Funzionerà bene con l'input del mouse, ma per quanto riguarda l'input touch, almeno per lo schermo che sto cercando di usare, sarà spento in un modo che lo rende inutilizzabile.

Nota : se il tuo codice sta eseguendo il file IO come il mio, devi usarlo cdper navigare nella posizione del tuo codice nello script di avvio o python supporrà che la sua posizione sia quella del tuo script e eseguirà il file IO di conseguenza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.