1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 树莓派开机自动运行python程序的两种方式

树莓派开机自动运行python程序的两种方式

时间:2020-08-21 11:43:37

相关推荐

树莓派开机自动运行python程序的两种方式

本文以一个简单的python程序为例,介绍树莓派开机程序自启动的两种方式,以及其中可能遇到的问题。python程序myled.py如下,保存路径为/home/pi/myled.py。

import RPi.GPIO as GPIOimport timeGPIO.setmode(GPIO.BOARD)GPIO.setup(35, GPIO.OUT)while True:GPIO.output(35,GPIO.HIGH)print("HIGH")time.sleep(1)GPIO.output(35,GPIO.LOW)print("LOW")time.sleep(1)

一、使用rc.local

编辑/etc/rc.local文件

sudo nano /etc/rc.local

在 fi 和 exit 0 之间加入要执行的命令python3 /home/pi/myled.py,然后重启,可以看到led闪烁,程序开机执行。

如果程序未能正常运行,可以使用sudo systemctl status rc-local查看程序报出的错误,这是很重要的。

使用该方式有两个缺点,目前我还不知道解决方法:

无法看到程序输出信息程序崩溃后不会自动重新启动

二、使用systemd

通过systemd配置python程序开机自启动的步骤如下:

编写unit文件,文件名要以.service结尾,这里我保存为/home/pi/mystart.service

[Unit]Description=My serviceAfter=network.target[Service]Restart=on-failureRestartSec=5ExecStart=/usr/bin/python3 -u /home/pi/myled.pyUser=pi[Install]WantedBy=multi-user.target

这个例子能够完成基本的应用自启动,unit文件还有很多参数,可以提供更强大的功能,更多可以自行百度,这里仅对上面例子中使用的选项进行解释。

[Unit]部分中,Description是对该服务的描述,After=network.target表示在网络服务启动之后启动该服务。

[Service]部分中,Restart=on-failure和RestartSec=5表示服务运行失败后,隔5s重新启动;ExecStart表示服务启动时执行的命令,这里执行myled.py程序,-u参数使python程序输出到journal中,这个后面会提到,需要注意文件要使用绝对路径;User=pi表示在pi用户下执行,默认应该是root用户。

[Install]部分中,WantedBy=multi-user.target定义为多用户运行模式,具体我也不太了解。

将该文件mystart.service复制到/etc/systemd/system目录下

sudo cp /home/pi/mystart.service /etc/systemd/system/mystart.service

使用systemctl管理服务 启动服务

sudo systemctl start mystart.service

此时可以看到led闪烁

查看服务状态

systemctl status mystart.service

使用journalctl查看该服务的输出

journalctl -u mystart -e

停止服务

sudo systemctl stop mystart.service

设置开机自启动

sudo systemctl enable mystart.service

关闭开机自启动

sudo systemctl disable mystart.service

添加或修改配置文件后,需要重新加载

sudo systemctl daemon-reload

使用systemd配置程序开机自启动可以更方便的查看程序输出的信息、以及程序运行的错误,并且可以设置程序崩溃后自动重启,如下图所示:

使用journalctl -u mystart -e查看,可以看到程序错误退出5s后会再重启。

两种方式都可能遇到的问题

在不指定用户的情况下,两者默认使用root用户执行,这时是不能使用一些安装在pi用户下的python库的。

使用sudo pip3 install packagename代表进行全局安装,安装后全局可用。pip3 install packagename代表仅该用户的安装,安装后仅该用户可用。所以如果你当时装库时使用后者,那么运行时就要指定用户,否则会报错找不到库。

解决方法有两种:

使用sudo pip3 install packagename再重装一遍;在运行命令中指定用户

使用rc.local指定用户启动

su - username -c 'command'

下图是以pi用户启动myled.py程序

使用systemd指定用户启动

这个在上文中已经提到了,在.service文件中[Service]下的User=pi表示在pi用户下执行。

参考资料

树莓派 使用 systemd 设置开机启动项

Systemd的使用指南

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。