จะบูตเข้าสู่สคริปต์ python ของตัวเอง (GUI) เท่านั้นได้อย่างไร


12

ฉันมีปัญหาดังต่อไปนี้: การใช้ RaspPi 3B ที่รัน Raspbian Jessie (รุ่น 4.4.26-v7 +) ฉันต้องการ GUI ของสคริปต์ Python ที่เขียนด้วยตนเองเพื่อเรียกใช้เมื่อเริ่มต้น

ฉันรู้ว่าคำถามนี้ถูกถามในเว็บไซต์นี้รวมถึงคำถามอื่น ๆ แต่เนื่องจาก Raspbian เปลี่ยนแปลงตลอดเวลาและไม่มีวิธีแก้ไขปัญหาที่แนะนำมาก่อนสำหรับฉัน (ดูด้านล่าง) ฉันต้องการถามอีกครั้ง

จากความเข้าใจของฉันฉันต้องโหลด XServer และรันสคริปต์ของฉันหลังจากนั้น สิ่งนี้จะเกิดขึ้นแทนที่จะโหลดทั้งเดสก์ท็อป

วิธีการหนึ่งในการบรรลุเป้าหมายนี้ควรจะผ่านทางไฟล์ autostart LXDE (ดังที่อธิบายไว้ในคำตอบนี้ ) ฉันแก้ไขไฟล์/etc/xdg/lxsession/LXDE-pi/autostartเช่นเดียวกับไฟล์/etc/xdg/lxsession/LXDE/autostart(เดิมมีสี่บรรทัดแทนที่จะเป็นสามบรรทัดตามที่แนะนำในการอ้างอิงโพสต์) - เพิ่มบรรทัด@sudo python /full/path/to/file.pyและ@openboxแต่ Pi ของฉันยังคงบูทเข้าไปในเดสก์ท็อปและไม่เรียกใช้สคริปต์โดยอัตโนมัติเลย คำอธิบายประกอบ: ฉันพยายามแค่บรรทัดสคริปต์และบรรทัดสคริปต์พร้อมกับบรรทัด openbox สำหรับไฟล์ใดไฟล์หนึ่งและทั้งสองไฟล์ด้วยกัน

กลยุทธ์อื่นเกี่ยวข้องกับไฟล์ rc.local (ตามที่แนะนำในเอกสารประกอบอย่างเป็นทางการ ) อย่างไรก็ตามการเพิ่มเพียงอย่างเดียวpython /full/path/to/file.py &ไม่ทำงาน (เนื่องจากยังคงมี GUI ของฉันหายไป) และการเพิ่มเพิ่มเติมstartxไม่ช่วยเพราะเห็นได้ชัดว่าฉันไม่สามารถเชื่อมโยง startx กับสคริปต์ไพ ธ อนและสคริปต์ตัวก่อนหน้าจึงปิดทันทีหลังจากเริ่มทำงาน

บางคนแนะนำว่าควรใช้. xinitrc (เพิ่มเติม) อย่างไรก็ตามสิ่งนี้ไม่ได้ผลเช่นกัน:

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

และสุดท้าย แต่ไม่ท้ายสุดมันควรจะสามารถใช้งานได้โดยใช้ init.d - แต่ฉันยังไม่พบรายละเอียดเกี่ยวกับสิ่งนี้

ฉันจะขอบคุณคำแนะนำใด ๆ ต่อทิศทางที่ถูกต้อง ความผิดพลาดของฉันอยู่ที่ไหน บรรทัดของฉันใน rc.local หรือ. xinitrc ควรมีลักษณะอย่างไร หรือมีการเปลี่ยนแปลงที่สำคัญเกี่ยวกับการเปลี่ยนเป็นพิกเซลและฉันควรลองอย่างอื่นหรือไม่?


ข้อมูลเพิ่มเติมบางอย่าง: สคริปต์ต้องการสิทธิ์ sudo มันเขียนใน Python 2.7 GUI ใช้ Tkinter GUI เติมเต็มหน้าจออย่างสมบูรณ์ดังนั้นพื้นหลังจึงไม่เกี่ยวข้อง สคริปต์ควรทำงานตลอดไป (หรือจนกว่าจะหยุดโดยอินพุตของผู้ใช้ผ่าน GUI) และใช้บริการระบบเช่น wifi และอีเธอร์เน็ต


ข้อมูลเพิ่มเติม: ทั้งหมดกำลังเกิดขึ้นในพื้นที่


ชี้แจง: ตอนนี้ฉันใช้เวลามากกว่า 8 ชั่วโมงในการค้นหาเครือข่ายลองใช้บทเรียนจากจุดเริ่มต้นที่แตกต่างกันหรือผสมเข้าด้วยกัน ฉันได้ข้อสรุปว่าสคริปต์ของฉัน (ซึ่งทำงานได้อย่างสมบูรณ์แบบเมื่อเริ่มต้นเป็นพิกเซล) ไม่ทำงานหากทำงานในสภาพแวดล้อมที่ไม่ใช่เดสก์ทอป (ซึ่งฉันสงสัย) หรือต้องการการสอนใหม่เนื่องจากตุลาคม 2559 เปลี่ยนเป็น Raspbian ทำแบบฝึกหัดเก่า ๆ ที่ล้าสมัยแล้ว นอกจากนี้ความท้าทายไม่ได้อยู่ที่การเริ่มต้นสคริปต์หรือการเริ่มต้น Xserver (หรือสิ่งที่คล้ายกัน) อย่างเป็นอิสระจากกัน แต่ในการทำทั้งสองเชื่อมโยงเพื่อให้สคริปต์จะใช้การแสดงผลที่สร้างขึ้นโดย Xserver


ฉันยอมรับว่ามันไม่ได้ช่วยอะไรมาก แต่อาจคุ้มค่าที่จะดูว่ารองเท้าบูท XBMC (หรือ HTPC dicrtibution อื่น ๆ ) เป็นอย่างไรบ้าง? หรืออาจจะตอบคำถามของคุณraspberrypi.stackexchange.com/questions/11866/…
Petr Gladkikh

คำตอบ:


12

ในช่วงเดือนที่ผ่านมาฉันได้ทำงานในสิ่งเดียวกันดังนั้นฉันจึงค้นคว้าวิธีทำสิ่งนี้มากและรู้วิธีการใช้ Raspbian (PIXEL) เวอร์ชันล่าสุด

nodmเป็นตัวจัดการการแสดงผลขั้นต่ำที่ข้ามการโหลด LXDE และopenbox(ซึ่งติดตั้งบน Pi แล้ว) จะมีตัวจัดการเซสชันที่น้อยที่สุดและทำงานกับเซิร์ฟเวอร์ X

การตั้งค่าสภาพแวดล้อมนี้ใน Raspbian ติดตั้งnodmด้วยและแก้ไขไฟล์apt-get /etc/default/nodmคุณจำเป็นต้องตั้งค่าตัวเลือกNODM_ENABLEDการtrueและNODM_USERไปpi(หรืออะไรก็ตามชื่อผู้ใช้ของคุณ)

จากนั้นสร้างไฟล์ Xsession ที่กำหนดเองในโฟลเดอร์บ้านของคุณ ( /home/pi/.xsession) โดยมีเนื้อหาดังต่อไปนี้ ( whileไม่จำเป็นต้องวนซ้ำมันจะรีสตาร์ทสคริปต์ Python โดยอัตโนมัติหากเกิดปัญหา):

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

และนี่คือสิ่งที่ฉันคิดว่าจำเป็น ฉันเขียนสคริปต์ Bash เพื่อตั้งค่านี้โดยอัตโนมัติ:

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

หมายเหตุ:

  • ฉันพบว่าลิงก์นี้มีประโยชน์ แต่ข้อมูลบางอย่างล้าสมัยแล้ว: https://blog.qruizelabs.com/2014/04/29/raspberrypi-kiosk-matchbox-uzbl/พวกเขาใช้เครื่องมือจัดการหน้าต่าง Matchbox ซึ่งไม่ทำงาน สำหรับฉันเพราะฉันต้องการการรองรับหลายหน้าต่าง แต่อาจเป็นตัวเลือกที่ดีถ้าคุณไม่ทำ
  • วิธีแก้ปัญหาข้างต้นใช้งานได้ แต่ฉันต้องการสภาพแวดล้อมที่สว่างที่สุดเท่าที่จะเป็นไปได้ดังนั้นฉันจึงเปลี่ยนมาใช้ Raspbian Lite ซึ่งไม่มี GUI และเริ่มต้นจากศูนย์เพียงแค่ติดตั้งแพ็คเกจที่จำเป็นอย่างยิ่งเท่านั้น กระบวนการคล้ายสวย แต่นอกเหนือไปจากnodmที่คุณจำเป็นต้องติดตั้งxserver-xorg, xinit, openboxและการอ้างอิงอื่น ๆ สคริปต์ของคุณมี จากนั้นถ้าคุณใช้ Openbox แทนที่จะเรียกใช้สคริปต์ Python ในไฟล์ Xsession ส่วนหนึ่งของรหัสที่ใช้จะต้องถูกย้ายไปยังสคริปต์อื่น ( /home/pi/.config/openbox/autostart) ฉันสามารถอธิบายเพิ่มเติมเกี่ยวกับวิธีการทำสิ่งนี้ได้หากต้องการ

สวัสดี tjohnson ฉันใช้วิธีที่คุณอธิบายไว้ข้างต้นบน Raspbian และทำให้มันใช้งานได้ดีขอบคุณ! ฉันต้องการลองทำใน Raspbian Lite และคุณพูดถึงในบันทึกย่อล่าสุดของคุณ ฉันติดตั้งการอ้างอิงพิเศษที่คุณระบุไว้ แต่แอปไม่เริ่มทำงาน ฉันคิดว่ามันเกี่ยวข้องกับความคิดเห็นล่าสุดของคุณเกี่ยวกับการย้ายไปยังสคริปต์อื่น ฉันไม่มีโฟลเดอร์ home / pi / .config / openbox ดังนั้นฉันจึงสร้างมันและไฟล์ autostart แต่ดูเหมือนว่ามันจะไม่ทำงาน คุณช่วยอธิบายรายละเอียดเกี่ยวกับเรื่องนี้ได้ไหม? ขอบคุณ
AngeloQ

@AngeloQ คุณได้รับมันเพื่อทำงานกับ Raspbian Lite?
พอล

1

ไฟล์ autostart มีอยู่ในหลาย ๆ ที่ มันเป็นเพียงเรื่องของการแก้ไขไฟล์ autostart ที่ถูกต้องที่เส้นทางที่ถูกต้อง /home/pi/.config/lxsession/LXDE-pi/autostartฉันพยายามแก้ไข ในที่สุดนั่นก็เป็นการหลอกลวงสำหรับฉัน

/etc/xdg/lxsession/LXDE-pi/autostart น่าจะเป็นเส้นทางที่ผิด


0

เคล็ดลับสกปรกผมเคยใช้ใน RPI ในอดีตที่ผ่านมาก็จะนำคำสั่งของฉันใน/etc/rc.localไฟล์ก่อนที่จะexit 0สาย ในกรณีของคุณฉันจะลองบรรทัดต่อไปนี้และรีบูต

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

ตามที่คุณระบุไว้ว่าจำเป็นต้องได้รับอนุญาตระดับ sudo คุณอาจต้องปรับsuคำสั่งที่คุณได้ลองไปก่อนหน้านี้เพราะตอนนี้ดูเหมือนว่าคุณกำลังพยายามเรียกใช้ภายใต้piผู้ใช้

หนึ่งคำเตือนเกี่ยวกับข้อเสนอแนะของฉันเกี่ยวกับการใช้ไฟล์ rc.local หากสคริปต์ของคุณออกจากสถานะไม่เป็นศูนย์คุณจะไม่ทำการบู๊ตให้ปลอดภัยในระหว่างการทดสอบคุณสามารถลองทำสิ่งต่อไปนี้เพื่อออกจากทางออกยังคงเท่ากับ 0

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

แก้ไขและอัปเดต

ดูข้อมูลการค้นหาบางส่วนพบคำแนะนำที่แสดงให้เห็นถึงการใช้สคริปต์ตัวเรียกใช้อ้างอิงในแท็บ cron เพื่ออำนวยความสะดวกในการโหลดสคริปต์ไพ ธ อน อาจดูเหมือนว่าจะมีการโหลด cron เพื่อโหลดสคริปต์ sh / bash เพื่อโหลด python แต่ ... มันซับซ้อนพอที่จะทำให้เกิดความรู้สึกที่บิดเบี้ยว


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Ghanima

0

ดังนั้นขึ้นอยู่กับว่าคุณต้องการรหัสของคุณด้วยวิธีใดวิธีนี้อาจใช้งานได้

สิ่งแรกที่ฉันทำคือสร้างสคริปต์ใน / directory ของฉันที่มีลักษณะดังนี้:

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

chmod -x scriptName.shคุณต้องให้ทำงานได้ด้วย

จากนั้นทำcrontab -eใน terminal และเพิ่ม@reboot sudo bash /scriptName.sh

ตั้งค่าตัวเลือกการเริ่มระบบของคุณเป็น CLI และคุณน่าจะดี! สิ่งนี้ใช้ได้กับ Raspbian 3B ของฉัน

หนึ่งข้อแม้ถ้าคุณกำลังใช้หน้าจอสัมผัสสำหรับคีออสก์ / หน้าจอของคุณฉันยังไม่ได้คิดออก มันจะทำงานได้ดีกับอินพุตของเมาส์ แต่สำหรับการป้อนข้อมูลแบบสัมผัสอย่างน้อยสำหรับหน้าจอที่ฉันพยายามจะใช้มันจะถูกปิดในลักษณะที่ทำให้มันใช้ไม่ได้

หมายเหตุ : หากรหัสของคุณกำลังทำไฟล์ IO เหมือนของฉันคุณต้องใช้cdเพื่อนำทางไปยังตำแหน่งของรหัสในสคริปต์ตัวเรียกใช้ของคุณหรือไพ ธ อนจะถือว่าตำแหน่งนั้นเป็นของสคริปต์ของคุณและจะดำเนินการไฟล์ IO ตามลำดับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.