Como inicializar apenas no próprio script python (GUI)?


12

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/autostarte 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.pye @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 startxnã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.


Admito que não é de muita ajuda, mas talvez valha a pena olhar como, por exemplo, o XBMC (ou outra distribuição HTPC) é inicializado? Como alternativa, talvez isso responda à sua pergunta raspberrypi.stackexchange.com/questions/11866/…
Petr Gladkikh

Respostas:


12

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 e openbox (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 nodmcom apt-gete editar o arquivo /etc/default/nodm. Você precisa definir a opção NODM_ENABLEDpara trueeNODM_USER para pi(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 (o whileloop não é necessário, apenas reinicia automaticamente o script Python se travar):

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

e isso deve ser tudo o que eu acho necessário. Eu escrevi um script Bash para configurar isso 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

Notas:

  • Achei este link útil, mas algumas das informações estão desatualizadas agora: https://blog.qruizelabs.com/2014/04/29/raspberrypi-kiosk-matchbox-uzbl/ Eles usam o gerenciador de janelas Matchbox, que não funcionou para mim porque eu precisava de suporte para várias janelas, mas pode ser uma boa opção se você não precisar.
  • A solução acima funcionou, mas eu queria um ambiente o mais leve possível, então mudei para o Raspbian Lite, que não tem interface gráfica, e comecei do zero instalando apenas os pacotes absolutamente necessários. O processo é bastante semelhante, mas, além de nodmque você precisa para instalar xserver-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.

Oi tjohnson, eu usei o método que você descreveu acima no Raspbian e o fiz funcionar, obrigado! Eu queria tentar usar o Raspbian Lite também que você mencionou em sua última nota. Instalei as dependências extras listadas, mas o aplicativo não foi iniciado. Suponho que esteja relacionado ao seu último comentário sobre como mudar isso para um script separado. Como não tenho uma pasta home / pi / .config / openbox, criei o arquivo de inicialização automática, mas ele não parece estar funcionando. Poderia, por favor, elaborar sobre isso? Graças
AngeloQ

@AngeloQ você conseguiu que ele funcionasse no Raspbian Lite?
Paul

1

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.


0

O truque sujo que usei no RPi no passado foi colocar comandos no meu /etc/rc.localarquivo antes da exit 0linha. No seu caso, eu tentaria a seguinte linha e reinicializaria.

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

Como você declarou que são necessárias permissões no nível do sudo, pode ser necessário ajustar o sucomando 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

python /full/path/to/file.py & || exit 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.


Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Ghanima

0

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:

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

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 cdpara 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.