Làm thế nào để chỉ khởi động vào tập lệnh python (GUI)?


12

Tôi có một vấn đề sau: Sử dụng RaspPi 3B chạy Raspbian Jessie (phiên bản 4.4.26-v7 +) Tôi muốn GUI của tập lệnh python tự viết được thực thi khi khởi động.

Tôi biết rằng câu hỏi này đã được hỏi trên trang web này cũng như trên những người khác, nhưng vì Raspbian liên tục thay đổi và không có giải pháp nào được đề xuất trước khi làm việc cho tôi (xem bên dưới), tôi muốn hỏi lại.

Theo hiểu biết của tôi, tôi cần tải XServer và thực hiện tập lệnh của mình sau đó. Điều này sẽ xảy ra thay vì tải toàn bộ máy tính để bàn.

Một cách để đạt được điều này được cho là thông qua tệp tự khởi động LXDE (như được nêu trong câu trả lời này ). Tôi đã chỉnh sửa tệp /etc/xdg/lxsession/LXDE-pi/autostartcũng như tệp /etc/xdg/lxsession/LXDE/autostart(trước đây có bốn dòng thay vì ba dòng như được đề xuất trong bài đăng được tham chiếu) - thêm các dòng @sudo python /full/path/to/file.py@openbox, nhưng Pi của tôi vẫn khởi động vào máy tính để bàn và hoàn toàn không tự động thực thi tập lệnh. Chú thích: Tôi đã thử chỉ dòng script và dòng script cùng với dòng openbox cho một trong hai tệp và cho cả hai tệp cùng nhau.

Một chiến lược khác liên quan đến tệp RC.local (như được đề xuất trong tài liệu chính thức ). Tuy nhiên, chỉ thêm python /full/path/to/file.py &không hoạt động (vì vẫn còn GUI của tôi bị thiếu) và thêm vào startxđó không giúp ích gì vì rõ ràng tôi không thể liên kết startx với tập lệnh python và do đó trước đó đã đóng ngay sau khi nó bắt đầu.

Một số gợi ý rằng (ngoài ra) .xinitrc nên được sử dụng. Điều này, tuy nhiên, cũng không hoạt động:

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

Và, cuối cùng nhưng không kém phần quan trọng, theo một cách nào đó, có thể thực hiện được bằng cách sử dụng init.d - nhưng tôi chưa tìm thấy chi tiết về điều này.

Tôi thực sự sẽ đánh giá cao bất kỳ gợi ý về hướng đúng. Lỗi của tôi ở đâu? Dòng của tôi trong RC.local hoặc .xinitrc trông như thế nào? Hoặc đã có những thay đổi lớn liên quan đến việc chuyển sang pixel và tôi nên thử một cái gì đó khác?


Một số thông tin bổ sung: Kịch bản cần quyền sudo. Nó được viết bằng Python 2.7, GUI đang sử dụng Tkinter. GUI lấp đầy màn hình hoàn toàn, vì vậy hình nền không liên quan. Kịch bản được cho là chạy mãi mãi (hoặc cho đến khi nó bị dừng bởi đầu vào của người dùng thông qua GUI) và sử dụng các dịch vụ hệ thống như wifi và ethernet.


Thêm thông tin: Tất cả đang diễn ra tại địa phương.


Làm rõ: Đến bây giờ tôi đã dành hơn 8 giờ để tìm kiếm trên mạng, thử các hướng dẫn từ các điểm bắt đầu khác nhau hoặc trộn chúng lại với nhau. Tôi đã đi đến kết luận rằng tập lệnh của tôi (hoạt động hoàn hảo khi bắt đầu bằng pixel) không hoạt động nếu chạy trong môi trường không có máy tính để bàn (mà tôi nghi ngờ) hoặc là một hướng dẫn mới là cần thiết, bởi vì tháng 10 năm 2016 thay đổi thành Raspbian làm cho bất kỳ hướng dẫn cũ hơn lỗi thời. Hơn nữa, thách thức không nằm ở việc khởi động tập lệnh hay khởi động Xserver (hoặc một cái gì đó tương tự) độc lập với nhau, mà là thực hiện cả hai liên kết để tập lệnh sẽ sử dụng màn hình được tạo bởi Xserver.


Tôi thừa nhận rằng nó không giúp ích nhiều, nhưng có lẽ nó đáng để xem ví dụ như XBMC (hoặc HTPC dicrtibifying) khác khởi động như thế nào? Ngoài ra, có thể điều này sẽ trả lời câu hỏi của bạn raspberrypi.stackexchange.com/questions/11866/iêu
Petr Gladkikh

Câu trả lời:


12

Trong khoảng một tháng qua, tôi đã nghiên cứu về cơ bản chính xác điều tương tự, vì vậy tôi đã nghiên cứu cách thực hiện điều này rất nhiều và biết cách thực hiện với phiên bản mới nhất của Raspbian (PIXEL).

nodmlà trình quản lý hiển thị tối thiểu bỏ qua việc tải LXDE và openbox(đã được cài đặt trên Pi) cung cấp trình quản lý phiên tối thiểu và hoạt động với máy chủ X.

Để thiết lập môi trường này trong Raspbian, cài đặt nodmvới apt-getvà chỉnh sửa các tập tin /etc/default/nodm. Bạn cần phải thiết lập các tùy chọn NODM_ENABLEDđể trueNODM_USERđể pi(hoặc bất kỳ tên của bạn).

Sau đó, tạo tệp Xsession tùy chỉnh trong thư mục nhà của bạn ( /home/pi/.xsession) với các nội dung sau ( whilevòng lặp không cần thiết, nó chỉ tự động khởi động lại tập lệnh Python nếu nó gặp sự cố):

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

và điều này nên là tất cả những gì cần thiết tôi nghĩ. Tôi đã viết một đoạn script Bash để tự động thiết lập nó:

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

Ghi chú:

  • Tôi thấy liên kết này hữu ích, nhưng một số thông tin đã lỗi thời: https://blog.qruizelabs.com/2014/04/29/raspberrypi-kiosk-matchbox-uzbl/ Họ sử dụng trình quản lý cửa sổ Matchbox, không hoạt động đối với tôi bởi vì tôi cần hỗ trợ nhiều cửa sổ, nhưng nó có thể là một lựa chọn tốt nếu bạn không.
  • Giải pháp trên có hiệu quả, nhưng tôi muốn một môi trường càng nhẹ càng tốt, vì vậy tôi đã chuyển sang Raspbian Lite không có GUI và bắt đầu từ đầu chỉ cài đặt các gói thực sự cần thiết. Quá trình này là khá tương tự, nhưng ngoài việc nodmbạn cần phải cài đặt xserver-xorg, xinit, openbox, và bất kỳ phụ thuộc khác kịch bản của bạn có. Sau đó, nếu bạn đang sử dụng Openbox, thay vì chạy tập lệnh Python trong tệp Xsession, phần mã chạy nó cần phải được chuyển sang một tập lệnh riêng ( /home/pi/.config/openbox/autostart). Tôi có thể giải thích thêm về cách làm điều này nếu muốn.

Xin chào tjohnson, tôi đã sử dụng phương pháp bạn mô tả ở trên trên Raspbian và làm cho nó hoạt động, cảm ơn bạn! Tôi muốn thử thực hiện trên Raspbian Lite mà bạn đã đề cập trong ghi chú cuối cùng của bạn. Tôi đã cài đặt các phụ thuộc bổ sung mà bạn đã liệt kê nhưng ứng dụng không bắt đầu. Tôi cho rằng nó liên quan đến bình luận cuối cùng của bạn về việc chuyển nó sang một kịch bản riêng. Tôi không có thư mục home / pi / .config / openbox vì vậy tôi đã tạo nó và tệp tự khởi động nhưng dường như nó không hoạt động. Bạn có thể vui lòng giải thích về điều đó? Cảm ơn
AngeloQ

@AngeloQ bạn có làm cho nó hoạt động trên Raspbian Lite không?
Paul

1

Tệp tự khởi động tồn tại ở một số nơi khác nhau. Nó chỉ đơn giản là vấn đề chỉnh sửa tập tin tự động khởi động đúng ở đường dẫn bên phải. Tôi đã thử chỉnh sửa /home/pi/.config/lxsession/LXDE-pi/autostart. Điều đó cuối cùng đã làm cho tôi lừa.

/etc/xdg/lxsession/LXDE-pi/autostart dường như là con đường sai


0

Thủ thuật bẩn mà tôi đã sử dụng trên RPi trong quá khứ là đặt các lệnh trong /etc/rc.localtệp của tôi ngay trước exit 0dòng. Trong trường hợp của bạn, tôi sẽ thử dòng sau và khởi động lại.

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

Như bạn đã nói rằng các quyền cấp sudo là cần thiết, bạn có thể phải điều chỉnh sulệnh bạn đã thử trước đây vì hiện tại có vẻ như bạn đang cố gắng chạy theo pingười dùng.

Một cảnh báo về đề xuất của tôi về việc sử dụng tệp RC.local, nếu tập lệnh của bạn thoát với trạng thái khác không, bạn sẽ không hoàn thành việc khởi động để an toàn hơn trong các thử nghiệm, bạn có thể thử cách sau để đảm bảo thoát vẫn bằng 0

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

Chỉnh sửa và cập nhật

Nhìn qua một số dữ liệu tìm kiếm, đã tìm thấy một hướng dẫn thể hiện bằng cách sử dụng tập lệnh launcher được tham chiếu trong tab cron để tạo điều kiện tải tập lệnh python. Có vẻ như sắp sửa tải cron để tải tập lệnh sh / bash để tải python nhưng ... nó đủ phức tạp để tạo cảm giác xoắn.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Ghanima

0

Vì vậy, tùy thuộc vào những gì đầu vào mã của bạn cần giải pháp này có thể làm việc.

Điều đầu tiên tôi làm là tạo một tập lệnh trong thư mục / của tôi như sau:

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

Bạn phải làm cho nó chạy được chmod -x scriptName.sh.

Sau đó làm crontab -etrong thiết bị đầu cuối và thêm@reboot sudo bash /scriptName.sh

Đặt tùy chọn khởi động của bạn thành CLI và bạn sẽ thấy ổn! Điều này làm việc trên 3B chạy Raspbian của tôi.

Một cảnh báo, nếu bạn đang sử dụng màn hình cảm ứng cho kiosk / màn hình của bạn, tôi vẫn chưa tìm ra. Nó sẽ hoạt động tốt với đầu vào chuột nhưng đối với đầu vào cảm ứng, ít nhất là đối với màn hình tôi đang cố sử dụng, nó sẽ tắt theo cách khiến nó không sử dụng được.

Lưu ý : Nếu mã của bạn đang thực hiện tệp IO như của tôi, bạn phải sử dụng cdđể điều hướng đến vị trí mã của mình trong tập lệnh trình khởi chạy hoặc python sẽ cho rằng vị trí của nó là tập lệnh của bạn và sẽ thực hiện tệp IO tương ứng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.