¿Cómo iniciar solo en mi propio script de Python (GUI)?

12

Tengo el siguiente problema: Uso de un RaspPi 3B con Raspbian Jessie (versión 4.4.26-v7 +) Me gustaría que la GUI de un script de Python auto-escrito se ejecute al inicio.

Sé que esta pregunta se ha formulado tanto en este sitio web como en otros, pero como Raspbian sigue cambiando y ninguna de las soluciones sugeridas antes funcionó para mí (ver más abajo), me gustaría volver a hacerla.

Según tengo entendido, necesito cargar XServer y ejecutar mi script después. Esto debería suceder en lugar de cargar todo el escritorio.

Se supone que una forma de lograr esto es a través del archivo de inicio automático LXDE (como se describe en esta respuesta ). Edité el archivo /etc/xdg/lxsession/LXDE-pi/autostarty el archivo /etc/xdg/lxsession/LXDE/autostart(el primero originalmente contenía cuatro líneas en lugar de tres como se sugiere en la publicación mencionada), agregando las líneas @sudo python /full/path/to/file.pyy @openbox, pero mi Pi aún se inicia en el escritorio y no ejecuta automáticamente el script. Anotación: probé solo la línea de script y la línea de script junto con la línea de openbox para cualquiera de los archivos y para ambos archivos juntos.

Otra estrategia involucra el archivo rc.local (como se sugiere en la documentación oficial ). Sin embargo, solo agregar python /full/path/to/file.py &no funcionó (ya que todavía faltaba mi GUI) y agregar más startxno ayudó, ya que aparentemente no pude vincular el startx con el script de python y, por lo tanto, el primero se cerró inmediatamente después de que comenzó.

Algunos sugieren que (adicionalmente) .xinitrc debería usarse. Esto, sin embargo, tampoco funcionó:

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

Y, por último, pero no menos importante, de alguna manera, debería ser factible usando init.d, pero aún no he encontrado detalles sobre esto.

Realmente agradecería cualquier pista hacia la dirección correcta. ¿Dónde está mi error? ¿Cómo debería ser mi línea en rc.local o .xinitrc? ¿O ha habido cambios importantes relacionados con el cambio a píxeles y debería intentar algo más?


Alguna información adicional: el script necesita derechos de sudo. Está escrito en Python 2.7, la GUI está usando Tkinter. La GUI llena la pantalla por completo, por lo que los fondos son irrelevantes. Se supone que la secuencia de comandos se ejecuta para siempre (o hasta que la entrada del usuario la detenga a través de la GUI) y utiliza servicios del sistema como wifi y ethernet.


Más información: Todo está sucediendo localmente.


Aclaración: por ahora pasé más de 8 horas buscando en la red, probando tutoriales desde diferentes puntos de partida o mezclándolos. Llegué a la conclusión de que mi script (que funciona perfectamente cuando se inicia en píxeles) no funciona si se ejecuta en un entorno que no es de escritorio (lo cual dudo) o que se necesita un nuevo tutorial, porque el octubre de 2016 cambia a Raspbian hizo obsoletos los tutoriales anteriores. Además, el desafío no radica en iniciar el script o iniciar Xserver (o algo similar) independientemente el uno del otro, sino en hacer ambos enlaces para que el script utilice la pantalla creada por Xserver.

Fantilein1990
fuente
Admito que no es de mucha ayuda, pero tal vez valga la pena ver cómo, por ejemplo, XBMC (u otra distribución HTPC) arranca. Alternativamente, tal vez esto respondería a su pregunta raspberrypi.stackexchange.com/questions/11866/…
Petr Gladkikh

Respuestas:

12

Durante el último mes más o menos, he estado trabajando básicamente en exactamente lo mismo, por lo que he investigado cómo hacer esto mucho y sé cómo hacerlo con la última versión de Raspbian (PIXEL).

nodmes un administrador de pantalla mínimo que evita la carga de LXDE y openbox(que ya está instalado en la Pi) proporciona un administrador de sesión mínimo y funciona con el servidor X.

Para configurar este entorno en Raspbian, instale nodmcon apt-gety editar el archivo /etc/default/nodm. Es necesario configurar la opción NODM_ENABLEDa truey NODM_USERa pi(o lo que es su nombre de usuario).

Luego, cree un archivo Xsession personalizado en su carpeta de inicio ( /home/pi/.xsession) con los siguientes contenidos (el whilebucle no es necesario, simplemente reinicia automáticamente el script de Python si falla):

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

y esto debería ser todo lo que sea necesario, creo. Escribí un script de Bash para configurar esto automáticamente:

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

Notas:

  • Este enlace me pareció útil, pero parte de la información está desactualizada ahora: https://blog.qruizelabs.com/2014/04/29/raspberrypi-kiosk-matchbox-uzbl/ Usan el administrador de ventanas Matchbox, que no funcionó para mí porque necesitaba soporte para múltiples ventanas, pero podría ser una buena opción si no lo haces.
  • La solución anterior funcionó, pero quería un entorno lo más ligero posible, así que me cambié a Raspbian Lite que no tiene GUI y comencé desde cero solo instalando los paquetes que son absolutamente necesarios. El proceso es bastante similar, pero además de nodmque es necesario instalar xserver-xorg, xinit, openbox, y cualesquiera otras dependencias a su guión tiene. Luego, si está utilizando Openbox, en lugar de ejecutar el script Python en el archivo Xsession, la parte del código que lo ejecuta debe moverse a un script separado ( /home/pi/.config/openbox/autostart). Puedo elaborar más sobre cómo hacer esto si lo deseo.
tjohnson
fuente
Hola tjohnson, utilicé el método que describiste anteriormente en Raspbian y lo puse a funcionar, ¡gracias! Quería intentar hacer Raspbian Lite que también mencionaste en tu última nota. Instalé las dependencias adicionales que enumeró pero la aplicación no se inició. Supongo que está relacionado con su último comentario sobre mover eso a un guión separado. No tengo una carpeta home / pi / .config / openbox, así que la creé y el archivo de inicio automático, pero parece que no funciona. ¿Podría por favor explicar eso? Gracias
AngeloQ
@AngeloQ, ¿lo hiciste funcionar en Raspbian Lite?
Paul
1

El archivo de inicio automático existe en varios lugares diferentes. Es simplemente una cuestión de editar el archivo de inicio automático correcto en la ruta correcta. Traté de editar /home/pi/.config/lxsession/LXDE-pi/autostart. Eso finalmente hizo el truco para mí.

/etc/xdg/lxsession/LXDE-pi/autostart Parece ser el camino equivocado.

nylesteiner
fuente
0

El truco sucio que usé en RPi en el pasado fue poner comandos en mi /etc/rc.localarchivo justo antes de la exit 0línea. En su caso, probaría la siguiente línea y reiniciaría.

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

Como ha indicado que se necesitan permisos de nivel de sudo, es posible que deba ajustar el sucomando que ha probado anteriormente porque en este momento parece que está intentando ejecutar bajo el piusuario.

Una advertencia sobre mi sugerencia de uso del archivo rc.local, si su script sale con un estado distinto de cero, no completará el arranque, por lo que para estar más seguro durante las pruebas, puede intentar lo siguiente para asegurar que la salida sigue siendo igual a 0

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

Ediciones y actualizaciones

Analizando algunos datos de búsqueda, encontré un instructable que demuestra el uso de un script de inicio al que se hace referencia en la pestaña cron para facilitar la carga de los scripts de Python. Puede parecer redondo a punto de cargar cron para cargar un script sh / bash para cargar python pero ... es lo suficientemente complicado como para tener un sentido retorcido.

S0AndS0
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Ghanima
0

Entonces, dependiendo de qué entrada necesita su código, esta solución puede funcionar.

Lo primero que hice fue crear un script en mi directorio / que diga así:

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

Tienes que hacer que sea ejecutable con chmod -x scriptName.sh.

Luego hazlo crontab -een la terminal y agrega@reboot sudo bash /scriptName.sh

¡Establezca su opción de arranque en CLI y debería estar listo! Esto funcionó en mi 3B con Raspbian.

Una advertencia: si está utilizando una pantalla táctil para su quiosco / pantalla, aún tengo que resolverlo. Funcionará bien con la entrada del mouse, pero en cuanto a la entrada táctil, al menos para la pantalla que estoy tratando de usar, estará apagada de una manera que la haga inutilizable.

Nota : Si su código está haciendo el archivo IO como el mío, debe usarlo cdpara navegar a la ubicación de su código en su script de inicio o Python asumirá que su ubicación es la de su script y realizará el archivo IO en consecuencia.

Alexzoin
fuente