如何在RaspBerry Pi 3(Raspbian(Debian))中自动启动python脚本?

问题描述 投票:1回答:1

问题是我无法找到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()

提前谢谢了!!!

python debian raspberry-pi3 raspbian autostart
1个回答
0
投票

我假设你正在运行raspbian不是吗?

由于Debian 7(raspbian基于Debian),默认的init系统是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',因为你希望它在运行级别启动序列的最后执行,即:
ln -s /etc/init.d/startApp /etc/rc5.d/S99startApp
© www.soinside.com 2019 - 2024. All rights reserved.