You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派开机自启带Tkinter GUI的Flask应用问题求助

问题描述

我尝试让带有Tkinter GUI的Flask应用在树莓派Model 3 B+开机后自动运行,但始终无法成功。我已将如下shell脚本放入/etc/init.d/目录:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          myapp
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: My Flask App
# Description:       My Flask App with Tkinter GUI
### END INIT INFO

case $1 in
    start)
        cd /home/pi/
        python3 script.py &
        ;;
    stop)
        pkill -f 'python3 script.py'
        ;;
    *)
        echo "Usage: /etc/init.d/myapp.sh {start|stop}"
        exit 1
        ;;
esac

exit 0

随后执行了命令:sudo update-rc.d myapp.sh defaults。


问题原因

init.d脚本在系统启动早期执行,此时X Window(GUI运行环境)尚未加载,而Tkinter程序必须依赖X环境才能启动。此外,脚本未指定DISPLAY环境变量,程序无法定位到GUI显示设备;同时直接用root用户运行GUI程序也可能引发权限问题。


解决方案

方案1:使用systemd服务(推荐)

systemd是当前树莓派默认的服务管理工具,能更好地处理依赖关系。创建/etc/systemd/system/myapp.service文件,写入以下内容:

[Unit]
Description=Flask Tkinter 应用
After=graphical.target  # 确保在GUI环境启动后再运行

[Service]
User=pi  # 用普通用户pi运行,避免root权限问题
Environment=DISPLAY=:0  # 指定显示设备
WorkingDirectory=/home/pi
ExecStart=/usr/bin/python3 /home/pi/script.py
Restart=on-failure  # 程序崩溃时自动重启

[Install]
WantedBy=graphical.target

执行以下命令完成配置:

sudo systemctl daemon-reload
sudo systemctl enable myapp.service  # 设置开机自启
sudo systemctl start myapp.service   # 立即启动服务

可通过sudo systemctl status myapp.service查看运行状态。

方案2:修复init.d脚本

如果坚持使用init.d,修改原脚本如下:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          myapp
# Required-Start:    $remote_fs $syslog $display-manager
# Required-Stop:     $remote_fs $syslog
# Default-Start:     5  # 只在运行级别5(GUI模式)启动
# Default-Stop:      0 1 6
# Short-Description: My Flask App
# Description:       My Flask App with Tkinter GUI
### END INIT INFO

case $1 in
    start)
        # 等待X环境就绪
        until xset q &>/dev/null; do
            sleep 1
        done
        # 指定DISPLAY并切换到pi用户运行
        su - pi -c "export DISPLAY=:0 && cd /home/pi && python3 script.py &"
        ;;
    stop)
        pkill -u pi -f 'python3 script.py'  # 只终止pi用户的进程
        ;;
    *)
        echo "Usage: /etc/init.d/myapp.sh {start|stop}"
        exit 1
        ;;
esac

exit 0

重新设置脚本权限并更新启动项:

sudo chmod +x /etc/init.d/myapp.sh
sudo update-rc.d myapp.sh defaults

方案3:桌面自动启动(适用于桌面用户)

如果你的树莓派使用官方桌面环境,可通过autostart实现登录后自动启动:

  1. 创建~/.config/autostart/myapp.desktop文件
  2. 写入以下内容:
[Desktop Entry]
Type=Application
Name=我的Flask应用
Exec=/usr/bin/python3 /home/pi/script.py
Terminal=false
Hidden=false

这样每次桌面登录后,程序会自动启动。


内容的提问来源于stack exchange,提问作者Rui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 23:02:18