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

import RPi.GPIO as GPIO
import 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查看程序报出的错误,这是很重要的。

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

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

二、使用systemd

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

  1. 编写unit文件,文件名要以.service结尾,这里我保存为/home/pi/mystart.service
[Unit]
Description=My service
After=network.target[Service]
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/python3 -u /home/pi/myled.py
User=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定义为多用户运行模式,具体我也不太了解。

  1. 将该文件mystart.service复制到/etc/systemd/system目录下
sudo cp /home/pi/mystart.service /etc/systemd/system/mystart.service
  1. 使用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代表仅该用户的安装,安装后仅该用户可用。所以如果你当时装库时使用后者,那么运行时就要指定用户,否则会报错找不到库。

解决方法有两种:

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

使用rc.local指定用户启动

su - username -c 'command'

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

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

参考资料

树莓派 使用 systemd 设置开机启动项
Systemd的使用指南

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

  1. 运行python程序的两种方式交互式和文件式_Python基础知识2

    运行Python程序的两种方式 小白学习,如有错误欢迎指点 一.每位小白写的第一个Python程序 1.运行Python程序的两种方式 1.1 交互式模式(即时对话) 打开cmd,打开Python解释 ...

  2. 周一02.3运行python程序的两种方式

    一.运行python程序的两种方式 方法一:交互式:                      优点:输入一行代码立刻返回结果                       缺点:无法永久保存代码 方法 ...

  3. python有两个运行程序分别是什么_运行python程序的两种方式

    [单选题]I wonder why ________ are so interested in action movies. [单选题]项目经理的职责不包括以下哪项内容 ? [简答题]结合项目的特点和 ...

  4. python打开方式包括_运行Python程序有两种方式:________和________。

    运行Python程序有两种方式:________和________. 答: 交互式 文件式 自觉的人,心目中有一张蓝图,人生理想.但是不知道世界的游戏规则 答:× 山水画的鉴赏方法? 答:1.首先看风 ...

  5. 运行python程序的两种方式交互式和文件式_执行Python程序的两种方式

    交互式(了解) 交互式环境下,敲完一条命令按下enter键马上能看到结果,调试程序方便.程序无法永久保存,关掉cmd窗口数据就消失了. 命令行式(了解) 打开文本编辑器,在文本编辑器中写入一串字符. ...

  6. 运行python程序的两种方式交互式和文件式_教你如何编写、保存与运行 Python 程序...

    第一步 接下来我们将看见如何在 Python 中运行一个传统的"Hello World"程序.Python教程本章将会教你如何编写.保存与运行 Python 程序. 通过 Pyth ...

  7. python程序执行的两种方式_012.执行Python程序的两种方式

    一.执行Python程序的两种方式 1.1 交互式 在终端内输入python3,然后输入python代码 交互式环境下,敲完一条命令按下enter键马上能看到结果,调试程序方便.程序无法永久保存,关掉 ...

  8. 运行Python程序的2种方式

    运行Python程序有2种方式: 使用交互式的带提示符的解释器 传统的使用源文件的方式 1.第一种方式 打开解释器 输入代码按回车,即可运行 2.第二种方式 新建一个python文件(我在D盘下新建了 ...

  9. 基础知识:编程语言介绍、Python介绍、Python解释器安装、运行Python解释器的两种方式、变量、数据类型基本使用

    阅读目录 今日学习内容: 1.编程语言的介绍 2.Python介绍 3.安装Python解释器(多版本共存) 4.运行Python解释器程序两种方式.(交互式与命令行式)(♥♥♥♥♥) 5.变量(♥♥ ...

  10. 运行Python程序的几种方式

    如何运行Python程序(即.py文件)? 第一种,使用自带的GUI工具IDLE.右键.py文件,选择IDLE打开,F5运行. 第二种,使用Windows的cmd窗口(快捷键win+R然后cmd回车) ...

最新文章

  1. Linux管道用法示例
  2. .net 反射调用私有变量
  3. python更改当前工作路径
  4. 大数据自学1-CentOS 下安装CDH及Cloudera Manager
  5. 免校准的电量计量芯片_交直流两用计量芯片HLW8112
  6. 【进阶修炼】——改善C#程序质量(5)
  7. 第八章(三)滑动窗口
  8. C/C++ 找出最大素数 算法
  9. cdr怎么做文字路径_CorelDRAW如何制作环绕圆形的路径文字
  10. 腾讯云服务器如何选择配置?
  11. fanuc机器人空间信号解析
  12. vue注册组件template传id
  13. STM32MP157驱动开发——Linux IIO驱动(上)
  14. 电机速度曲线规划1:梯形速度曲线设计与实现
  15. matlab2021安装教程
  16. 深入 AXI4总线 (四):RAM 读取实战
  17. DDS信号发生器原理与vivado仿真
  18. matlab 坐标移动,如何移动坐标轴到指定的位置
  19. 人工智能之语音识别技术(四)
  20. [bzoj4544]椭圆上的整点 解题报告

热门文章

  1. COMSOL6.0软件安装说明+视频教程
  2. oracle:根据出生日期计算年龄
  3. 东北大学毕业设计(论文)全程解析
  4. 佳能Canon imageCLASS MF4830d 打印机驱动
  5. 2022-2027年中国DTP药房行业市场全景评估及发展战略规划报告
  6. 冲刺倒计时,复习核心是什么?
  7. 用计算机完成计算win7,算天数转单位Win7计算器能做得更多
  8. win7科学计算机的用法,Win7自带计算器使用功能介绍
  9. 简述sqlite数据库的特点_sqlite数据库特点
  10. 计算机械效率的简便公式,机械效率公式