Как автоматически запустить скрипт Python в RaspBerry Pi 3 (Raspbian (Debian))? - PullRequest
0 голосов
/ 22 февраля 2019

Проблема в том, что я не могу найти способ для файла Application.py для автоматического выполнения при запуске системы.Я пробовал несколько способов;crontab, init.d, rc.local.И сценарий sh выполняется, проблема в том, что в строке, где он находится: sudo /usr/lib/python3 /home/pi/file.py, ничего не происходит.Я знаю, что sh выполняется, потому что я создаю файл test1.log, и он всегда создается при запуске.

С другой стороны, если я вручную выполню sudo /etc/init.d/startApp start, все будет работать нормально, и когда вы введете sudo /etc/init.d/inicioApp stop, процесс остановится.Затем я оставляю файл /etc/init.d/startApp, чтобы посмотреть, может ли кто-нибудь мне помочь, помните, что Raspbian работает на Raspberry Pi 3 Model B V1.2.

Файл /etc/init.d/startApp:

#! /bin/sh
# /etc/init.d/startApp

### BEGIN INIT INFO
# Provides: startApp
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start Application
# Description: Start Application.py automatically.
### END INIT INFO


case "$1" in
 start)
  echo "Start Application.py"
  echo "startApp is running" >> /home/pi/test1.log
  sudo /usr/bin/python3 /home/pi/Application.py
  ;;

 stop)
  echo "Stop Application.py"
  /usr/bin/python3 -kill :1
  ;;

 *)
  echo "Usage: /etc/init.d/startApp {start|stop}"
  exit 1
  ;;
esac

exit 0

Файл /home/pi/Application.py:

from PIL import Image, ImageTk
import sys

try:
    import tkinter as tk  # Python 3
except ImportError:
    import Tkinter as tk  # Python 2

import RPi.GPIO as GPIO

GPIO_present = True
GPIO_PULSE = 4
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(GPIO_PULSE, GPIO.IN, GPIO.PUD_UP)


class Application(tk.Frame):
    DELAY = 100  # ms
    IMG_DELAY = 200
    POST_DELAY = 2000

    def __init__(self, master=None):
        super().__init__(master)
        print("executed")
        self.pack()
        self.w, self.h = self.winfo_screenwidth(), self.winfo_screenheight()
        self.img_name = "/home/pi/pattern.png"
        self.control = 0
        self.create_widgets()
        self.flag = False
        self.after(self.DELAY, self.check_signal)
        root.bind('<Escape>', self.quitApp)

    def load_image(self, filename):

        try:
            pil_img = Image.open(filename)
            img_width, img_height = pil_img.size

            if img_width > self.w or img_height > self.h:  # Too big?
                size = (int(self.w), int(self.h))
                pil_img = pil_img.resize(size)
                ratio = min(self.w / img_width, self.h / img_height)
                img_width, img_height = int(img_width * ratio), int(img_height * ratio)
                pil_img = pil_img.resize((img_width, img_height), Image.ANTIALIAS)  # Resize.
            self.control = 0
            img = ImageTk.PhotoImage(pil_img)  # Convert to tkinter PhotoImage.
            return img

        except FileNotFoundError:
            self.control = 1

    def quitApp(self, a):
        root.destroy()

    def create_widgets(self):
        file = open("testfile.txt", "w")

        file.write("Se ejecuto.py")

        file.close()
        self.canvas = tk.Canvas(root, width=self.w, height=self.h, background='black')
        self.canvas.pack()

        self.pattern_img = self.load_image(self.img_name)
        if self.control == 1:
            sys.exit()
            root.destroy()

        self.image_id = self.canvas.create_image(self.w / 2, self.h / 2, image=None)

    def show_image(self):
        self.cur_img = self.pattern_img
        self.after(self.IMG_DELAY)
        self.canvas.itemconfigure(self.image_id, image=self.cur_img)
        self.update()
        self.after(self.POST_DELAY)
        self.canvas.delete(self.image_id)
        self.image_id = self.canvas.create_image(self.w / 2, self.h / 2, image=None)

    def check_signal(self):

        if GPIO_present:
            self.flag = not GPIO.input(GPIO_PULSE)

        if self.flag:
            self.show_image()
            self.flag = False  # Reset

        root.after(self.DELAY, self.check_signal)  # Check again after delay.


if __name__ == '__main__':
    root = tk.Tk()
    w, h = root.winfo_screenwidth(), root.winfo_screenheight()
    root.wm_attributes('-fullscreen', 'true')
    root.focus_set()

app = Application(root)

app.mainloop()

Большое спасибо заранее !!!

1 Ответ

0 голосов
/ 22 февраля 2019

Полагаю, вы используете raspbian, не так ли?

Поскольку в Debian 7 (raspbian основан на Debian), система инициализации по умолчанию - systemd , тем не менее, есть совместимость со старымизвестный systemv , поэтому вы все еще можете использовать подход /etc/init.d/youscript, но, пожалуйста, убедитесь, что:

  • Предоставьте разрешения на выполнение для вашего сценария init.d startApp
  • Выберите, какие уровни запуска вы хотите, чтобы startApp выполнялся, т. Е. 5,3, и т. Д. Уровень запуска по умолчанию можно найти с помощью:
sudo runlevel
  • Использовать update-rc.d, чтобы поместить ваш скрипт в автозагрузку для уровня запуска по умолчанию (таким образом, вам не нужно беспокоиться, если по умолчанию используется /etc/rc5.d или /etc/rc2.d, он делает это за вас)
update-rc.d script-name default
  • ( Необязательно, если не используется update-rc.d ) Создайте программную ссылку и укажите ее в правильном каталоге уровня запуска /etc/rcX.d, новажно помнить имя !, важно, чтобы для начала было указано «S», а число «99», как вы хотитеo быть выполненным в самом конце последовательности запуска уровня запуска, то есть:
ln -s /etc/init.d/startApp /etc/rc5.d/S99startApp
...