在启动树莓派时运行 python 脚本的问题

时间:2021-02-19 01:52:46

标签: python linux raspberry-pi

我的脚本在启动时遇到了大量麻烦,我尝试了无数方法并花了数小时试图让它发挥作用。

我有一个需要在启动时运行的 python 脚本。但是需要上网,所以需要等待网络。

在我尝试过的几个教程中,我尝试了很多方法,使用 crontab,通过使用 systemd 和 rc.local 创建服务,但是这些方法都没有奏效。

我能够工作的唯一方法是进行 .desktop 桌面输入,但这仅在我插入外接显示器时对我有用,而我的树莓派将在没有外接显示器的情况下运行。

此外,我能够使用 service 方法运行我的脚本,现在使用 rc.local

通过添加这一行:

sudo bash -c '/usr/bin/python3 /home/pi/Projects/capstone/main.py > /home/pi/capstone.log 2>&1' &

但是,在我尝试运行的 python 脚本中,我有以下代码:

os.system("sudo killall servod")
time.sleep(1)   
os.system('sudo ~/PiBits/ServoBlaster/user/./servod')

出于某种原因,它没有正确运行我的脚本,因为我的日志中出现以下错误:

servod: no process found
sudo: /root/PiBits/ServoBlaster/user/./servod: command not found

第一个是预期的,因为我在可能启动或可能不启动时运行 sudo killall 伺服,但第二个“找不到命令”是问题所在,如果那段代码没有执行我的程序不起作用。

有人能帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

替换:

os.system('sudo ~/PiBits/ServoBlaster/user/./servod')

与:

os.system('sudo /home/pi/PiBits/ServoBlaster/user/./servod')

答案 1 :(得分:0)

  1. 仔细检查路径并尝试使用绝对路径
  2. 确保您的脚本具有 644 权限

您也可以尝试将脚本复制到 /etc/init.d 并作为 init.d 脚本运行。您确实需要将以下内容添加到您的脚本中:

### BEGIN INIT INFO
# Provides:          scriptname
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

sudo chmod +x <yourscript.py>
sudo update-rc.d <yourscript.py> defaults

答案 2 :(得分:0)

在 python 脚本中可以轻松等待网络的一种方法是 ping 服务器直到成功 - 在这种情况下是谷歌。

def wait_for_network():
    while os.system("ping -c 1 8.8.8.8") != 0:
        time.sleep(1)
    return

至于在启动时运行脚本,我建议编辑 /etc/xdg/lxsession/LXDE-pi/autostart 并使用格式在其中添加您的 python 脚本

@python3 home/pi/your_script.py