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/autostart
y 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.py
y @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 startx
no 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.
Respuestas:
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).
nodm
es un administrador de pantalla mínimo que evita la carga de LXDE yopenbox
(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
nodm
conapt-get
y editar el archivo/etc/default/nodm
. Es necesario configurar la opciónNODM_ENABLED
atrue
yNODM_USER
api
(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 (elwhile
bucle no es necesario, simplemente reinicia automáticamente el script de Python si falla):y esto debería ser todo lo que sea necesario, creo. Escribí un script de Bash para configurar esto automáticamente:
Notas:
nodm
que es necesario instalarxserver-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.fuente
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.fuente
El truco sucio que usé en RPi en el pasado fue poner comandos en mi
/etc/rc.local
archivo justo antes de laexit 0
línea. En su caso, probaría la siguiente línea y reiniciaría.Como ha indicado que se necesitan permisos de nivel de sudo, es posible que deba ajustar el
su
comando que ha probado anteriormente porque en este momento parece que está intentando ejecutar bajo elpi
usuario.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
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.
fuente
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í:
Tienes que hacer que sea ejecutable con
chmod -x scriptName.sh
.Luego hazlo
crontab -e
en 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
cd
para 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.fuente