Eu tenho o seguinte problema: Usando um RaspPi 3B executando o Raspbian Jessie (versão 4.4.26-v7 +), gostaria que a GUI de um script python auto-escrito fosse executada na inicialização.
Sei que essa pergunta foi feita neste site e em outros, mas como o Raspbian continua mudando e nenhuma das soluções sugeridas antes funcionou para mim (veja abaixo), eu gostaria de perguntar novamente.
Pelo que entendi, preciso carregar o XServer e executar meu script posteriormente. Isso deve acontecer em vez de carregar toda a área de trabalho.
Uma maneira de conseguir isso é através do arquivo de inicialização automática do LXDE (conforme descrito nesta resposta ). Editei o arquivo /etc/xdg/lxsession/LXDE-pi/autostart
e o arquivo /etc/xdg/lxsession/LXDE/autostart
(o primeiro continha originalmente quatro linhas em vez de três, conforme sugerido no post mencionado) - adicionando as linhas @sudo python /full/path/to/file.py
e @openbox
, mas meu Pi ainda é inicializado na área de trabalho e não executa o script automaticamente. Anotação: tentei apenas a linha de script e a linha de script junto com a linha de caixa aberta para um dos arquivos e para os dois arquivos juntos.
Outra estratégia envolve o arquivo rc.local (como sugerido na documentação oficial ). No entanto, apenas a adição python /full/path/to/file.py &
não funcionou (pois ainda estava faltando minha GUI) e a adição adicional startx
não ajudou, pois aparentemente eu não conseguia vincular o startx ao script python, e o primeiro foi fechado imediatamente após o início.
Alguns sugerem que (adicionalmente) .xinitrc deve ser usado. Isso, no entanto, também não funcionou:
su -c python /full/path/to/file.py pi
E, por último, mas não menos importante, de alguma forma, deve ser possível usar o init.d - mas ainda não encontrei detalhes sobre isso.
Eu realmente aprecio qualquer dica na direção certa. Onde está meu erro? Como deve ser minha linha em rc.local ou .xinitrc? Ou houve grandes alterações relacionadas à mudança para pixel e devo tentar outra coisa?
Algumas informações adicionais: O script precisa de direitos sudo. Está escrito em Python 2.7, a GUI está usando o Tkinter. A GUI preenche a tela completamente, portanto, os planos de fundo são irrelevantes. O script deve ser executado para sempre (ou até que seja interrompido pela entrada do usuário através da GUI) e usa serviços de sistema como Wi-Fi e Ethernet.
Mais informações: Tudo está acontecendo localmente.
Esclarecimento: A essa altura, passei mais de 8 horas pesquisando na rede, testando tutoriais de diferentes pontos de partida ou misturando-os. Cheguei à conclusão de que meu script (que funciona perfeitamente quando iniciado em pixel) não funciona se for executado em um ambiente não desktop (o que duvido) ou que um novo tutorial é necessário, porque o outubro de 2016 muda para Raspbian tornou obsoletos os tutoriais mais antigos. Além disso, o desafio não está em iniciar o script ou iniciar o Xserver (ou algo semelhante) independentemente um do outro, mas em fazer os dois vinculados para que o script use a exibição criada pelo Xserver.
Respostas:
Nos últimos meses, estive trabalhando basicamente na mesma coisa, então pesquisei muito sobre isso e sei como fazê-lo com a versão mais recente do Raspbian (PIXEL).
nodm
é um gerenciador de exibição mínimo que ignora o carregamento do LXDE eopenbox
(que já está instalado no Pi) fornece um gerenciador de sessões mínimo e trabalha com o servidor X.Para configurar esse ambiente em Raspbian, instale
nodm
comapt-get
e editar o arquivo/etc/default/nodm
. Você precisa definir a opçãoNODM_ENABLED
paratrue
eNODM_USER
parapi
(ou qualquer que seja seu nome de usuário).Em seguida, crie um arquivo Xsession personalizado em sua pasta pessoal (
/home/pi/.xsession
) com o seguinte conteúdo (owhile
loop não é necessário, apenas reinicia automaticamente o script Python se travar):e isso deve ser tudo o que eu acho necessário. Eu escrevi um script Bash para configurar isso automaticamente:
Notas:
nodm
que você precisa para instalarxserver-xorg
,xinit
,openbox
, e quaisquer outras dependências seu script tem. Então, se você estiver usando o Openbox, em vez de executar o script Python no arquivo Xsession, a parte do código que o executa precisará ser movida para um script separado (/home/pi/.config/openbox/autostart
). Eu posso elaborar mais sobre como fazer isso, se desejar.fonte
O arquivo de inicialização automática existe em vários locais diferentes. É simplesmente uma questão de editar o arquivo de inicialização automática correto no caminho certo. Eu tentei editar
/home/pi/.config/lxsession/LXDE-pi/autostart
. Isso finalmente fez o truque para mim./etc/xdg/lxsession/LXDE-pi/autostart
parece ser o caminho errado.fonte
O truque sujo que usei no RPi no passado foi colocar comandos no meu
/etc/rc.local
arquivo antes daexit 0
linha. No seu caso, eu tentaria a seguinte linha e reinicializaria.Como você declarou que são necessárias permissões no nível do sudo, pode ser necessário ajustar o
su
comando que você tentou anteriormente, porque agora parece que você está tentando executar sob o comandopi
usuário.Um aviso sobre a minha sugestão de uso do arquivo rc.local, se o seu script sair com um status diferente de zero, você não concluirá a inicialização para ficar mais seguro durante os testes. Você pode tentar o seguinte para garantir que a saída ainda seja igual a 0
Edições e atualizações
Examinando alguns dados de pesquisa, encontrou um instrutível que demonstra o uso de um script do iniciador mencionado na guia cron para facilitar o carregamento de scripts python. Pode parecer redondo carregar o cron para carregar um script sh / bash para carregar o python, mas ... é complicado o suficiente para fazer algum sentido distorcido.
fonte
Portanto, dependendo de qual entrada seu código precisa, esta solução pode funcionar.
A primeira coisa que fiz foi criar um script no meu diretório / que fica assim:
Você tem que tornar isso rodável com
chmod -x scriptName.sh
.Então faça
crontab -e
no terminal e adicione@reboot sudo bash /scriptName.sh
Defina sua opção de inicialização para CLI e você deve estar pronto! Isso funcionou no meu 3B rodando Raspbian.
Uma ressalva, se você estiver usando uma tela sensível ao toque para o seu quiosque / tela, ainda preciso descobrir. Funcionará bem com a entrada do mouse, mas quanto à entrada por toque, pelo menos na tela que estou tentando usar, ela será desativada de uma maneira que a tornará inutilizável.
Nota : Se o seu código está fazendo IO arquivo como o meu que você deve usar
cd
para navegar para a localização do seu código em seu script lançador ou python vai assumir a sua localização é que do seu script e irá executar arquivo IO conformidade.fonte