gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:14:25 25 4
gpt4 key购买 nike

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

非常感谢!

最佳答案

我假设你运行的是 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 则可选)创建一个软链接(soft link)并将其指向正确的运行级别目录/etc/rcX.d,但请注意名称!这很重要,它将具有一个代表开始的“S”和一个像“99”这样的数字,因为您希望它在运行级别启动序列的最后执行,即:
ln -s /etc/init.d/startApp /etc/rc5.d/S99startApp

关于python - 如何在 RaspBerry Pi 3 (Raspbian (Debian)) 中自动启动 python 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54829764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com