Bagaimana cara mem-boot ke skrip python sendiri (GUI) saja?

12

Saya memiliki masalah berikut: Menggunakan RaspPi 3B yang menjalankan Raspbian Jessie (versi 4.4.26-v7 +) Saya ingin GUI skrip python yang ditulis sendiri untuk dijalankan pada startup.

Saya tahu bahwa pertanyaan ini telah diajukan di situs web ini dan juga pada orang lain, tetapi karena Raspbian terus berubah dan tidak ada solusi yang disarankan sebelum bekerja untuk saya (lihat di bawah), saya ingin menanyakannya lagi.

Dari pemahaman saya, saya perlu memuat XServer dan menjalankan skrip saya setelahnya. Ini seharusnya terjadi alih-alih memuat seluruh desktop.

Salah satu cara untuk mencapai ini seharusnya melalui file autostart LXDE (seperti yang dijabarkan dalam jawaban ini ). Saya mengedit file /etc/xdg/lxsession/LXDE-pi/autostartserta file /etc/xdg/lxsession/LXDE/autostart(yang pertama berisi empat baris, bukan tiga seperti yang disarankan dalam posting yang dirujuk) - menambahkan baris @sudo python /full/path/to/file.pydan @openbox, tetapi Pi saya masih boot ke desktop dan tidak secara otomatis menjalankan skrip sama sekali. Anotasi: Saya mencoba hanya baris skrip dan baris skrip bersama dengan baris openbox untuk salah satu file dan untuk kedua file bersamaan.

Strategi lain melibatkan file rc.local (seperti yang disarankan dalam dokumentasi resmi ). Namun, hanya menambahkan python /full/path/to/file.py &tidak berfungsi (karena masih ada GUI saya hilang) dan menambahkan lebih lanjut startxtidak membantu karena saya tampaknya tidak dapat menghubungkan startx dengan skrip python dan karena itu ditutup segera setelah dimulai.

Beberapa menyarankan , bahwa (tambahan) .xinitrc harus digunakan. Namun, ini tidak berhasil:

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

Dan, last but not least, dalam beberapa hal, itu harus bisa dilakukan menggunakan init.d - tapi saya belum menemukan detail tentang ini, belum.

Saya akan sangat menghargai setiap petunjuk menuju arah yang benar. Di mana kesalahan saya? Bagaimana seharusnya baris saya di rc.local atau .xinitrc? Atau apakah ada perubahan besar terkait dengan beralih ke piksel dan saya harus mencoba yang lain?


Beberapa informasi tambahan: Skrip membutuhkan hak sudo. Itu ditulis dalam Python 2.7, GUI menggunakan Tkinter. GUI mengisi layar sepenuhnya, sehingga latar belakang tidak relevan. Script seharusnya dijalankan selamanya (atau sampai dihentikan oleh input pengguna melalui GUI) dan menggunakan layanan sistem seperti wifi dan ethernet.


Informasi lebih lanjut: Semua terjadi secara lokal.


Klarifikasi: Sekarang saya menghabiskan lebih dari 8 jam mencari di internet, mencoba tutorial dari titik awal yang berbeda atau menggabungkannya. Saya sampai pada kesimpulan, bahwa skrip saya (yang berfungsi sempurna saat dimulai dalam piksel) tidak berfungsi jika dijalankan di lingkungan non-desktop (yang saya ragu) atau bahwa tutorial baru diperlukan, karena perubahan Oktober 2016 ke Raspbian membuat tutorial yang lebih lama menjadi usang. Lebih jauh, tantangannya terletak bukan pada memulai skrip atau memulai Xserver (atau yang serupa) secara independen satu sama lain, tetapi dalam melakukan keduanya yang ditautkan sehingga skrip akan menggunakan tampilan yang dibuat oleh Xserver.

Fantile1990
sumber
Saya akui itu tidak banyak membantu, tapi mungkin ada baiknya melihat bagaimana misalnya XBMC (atau dicrtibution HTPC lainnya) boot? Atau, mungkin ini akan menjawab pertanyaan Anda raspberrypi.stackexchange.com/questions/11866/…
Petr Gladkikh

Jawaban:

12

Selama sebulan terakhir ini pada dasarnya saya telah mengerjakan hal yang persis sama, jadi saya telah meneliti bagaimana melakukan ini banyak dan tahu bagaimana melakukannya dengan versi terbaru dari Raspbian (PIXEL).

nodmadalah manajer tampilan minimal yang mem-bypass pemuatan LXDE, dan openbox(yang sudah diinstal pada Pi) menyediakan manajer sesi minimal dan bekerja dengan X server.

Untuk mengatur lingkungan ini di Raspbian, instal nodmdengan apt-getdan edit file /etc/default/nodm. Anda perlu mengatur opsi NODM_ENABLEDke truedan NODM_USERke pi(atau apa pun nama pengguna Anda).

Kemudian buat file Xsession khusus di folder rumah Anda ( /home/pi/.xsession) dengan konten berikut ( whileloop tidak diperlukan, itu hanya secara otomatis me-restart skrip Python jika crash):

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

dan ini semua yang perlu saya pikir. Saya menulis skrip Bash untuk mengatur ini secara otomatis:

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

Catatan:

  • Saya menemukan tautan ini bermanfaat, tetapi beberapa informasi sudah usang sekarang: https://blog.qruizelabs.com/2014/04/29/raspberrypi-kiosk-matchbox-uzbl/ Mereka menggunakan window manager Matchbox, yang tidak berfungsi bagi saya karena saya memerlukan beberapa dukungan jendela, tetapi mungkin itu pilihan yang bagus jika Anda tidak.
  • Solusi di atas berhasil, tetapi saya ingin lingkungan seringan mungkin, jadi saya beralih ke Raspbian Lite yang tidak memiliki GUI dan mulai dari awal hanya menginstal paket yang benar-benar diperlukan. Proses ini sangat mirip, tetapi di samping nodmAnda perlu untuk menginstal xserver-xorg, xinit, openbox, dan setiap dependensi lainnya naskah Anda memiliki. Kemudian jika Anda menggunakan Openbox, alih-alih menjalankan skrip Python di file Xsession, bagian dari kode yang menjalankannya perlu dipindahkan ke skrip terpisah ( /home/pi/.config/openbox/autostart). Saya bisa menguraikan lebih lanjut tentang cara melakukan ini jika diinginkan.
tjohnson
sumber
Hai tjohnson, saya menggunakan metode yang Anda jelaskan di atas pada Raspbian dan berhasil, terima kasih! Saya ingin mencoba melakukannya di Raspbian Lite juga yang Anda sebutkan di catatan terakhir Anda. Saya menginstal dependensi tambahan yang Anda daftarkan tetapi aplikasi tidak dimulai. Saya menganggap itu terkait dengan komentar terakhir Anda tentang memindahkannya ke skrip terpisah. Saya tidak memiliki folder home / pi / .config / openbox jadi saya membuatnya dan file autostart tetapi sepertinya tidak berfungsi. Bisakah Anda menjelaskannya? Terima kasih
AngeloQ
@AngeloQ apakah Anda dapat menggunakannya di Raspbian Lite?
Paul
1

File autostart ada di beberapa tempat berbeda. Ini hanyalah masalah mengedit file autostart yang tepat di jalur yang benar. Saya mencoba mengedit /home/pi/.config/lxsession/LXDE-pi/autostart. Akhirnya itu berhasil bagi saya.

/etc/xdg/lxsession/LXDE-pi/autostart tampaknya jalan yang salah.

nylesteiner
sumber
0

The kotor trik yang saya gunakan di RPI di masa lalu adalah untuk menempatkan perintah dalam saya /etc/rc.localberkas sebelum exit 0line. Dalam kasus Anda, saya akan mencoba baris berikut dan reboot.

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

Seperti yang telah Anda nyatakan bahwa diperlukan izin tingkat sudo, Anda mungkin harus menyesuaikan superintah yang sebelumnya Anda coba karena saat ini sepertinya Anda mencoba menjalankannya di bawah pipengguna.

Satu peringatan tentang saran saya untuk penggunaan file rc.local, jika skrip Anda keluar dengan status bukan nol Anda tidak akan menyelesaikan booting agar lebih aman selama pengujian, Anda dapat mencoba yang berikut untuk keluar keluar masih sama dengan 0

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

Suntingan dan pembaruan

Melihat melalui beberapa data pencarian, menemukan instruksi yang menunjukkan menggunakan skrip peluncur direferensikan di tab cron untuk memfasilitasi memuat skrip python. Mungkin kelihatannya akan memuat cron untuk memuat skrip sh / bash untuk memuat python tapi ... itu berbelit-belit sehingga cukup masuk akal.

S0AndS0
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Ghanima
0

Jadi tergantung pada input apa yang dibutuhkan kode Anda, solusi ini dapat berfungsi.

Hal pertama yang saya lakukan adalah membuat skrip di direktori / saya yang berbunyi seperti ini:

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

Anda harus membuat runnable dengan itu chmod -x scriptName.sh.

Kemudian lakukan crontab -edi terminal dan tambahkan@reboot sudo bash /scriptName.sh

Tetapkan opsi boot Anda ke CLI dan Anda harus siap! Ini bekerja pada 3B saya menjalankan Raspbian.

Satu peringatan, jika Anda menggunakan layar sentuh untuk kios / layar saya, saya belum mengetahuinya. Ini akan bekerja dengan baik dengan input mouse tetapi untuk input sentuh, setidaknya untuk layar yang saya coba gunakan, itu akan dimatikan dengan cara yang membuatnya tidak dapat digunakan.

Catatan : Jika kode Anda melakukan file IO seperti milik saya, Anda harus menggunakan cduntuk menavigasi ke lokasi kode Anda di skrip peluncur Anda atau python akan menganggap lokasinya adalah skrip Anda dan akan melakukan file IO yang sesuai.

Alexzoin
sumber