抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

在RK3588 Buildroot系统上部署Python应用时,手动操作步骤繁琐且容易出错——需要通过adb逐一上传文件、安装依赖、配置init.d自启动脚本。为此我写了一套一键部署工具,支持PowerShell和Git Bash,通过一条命令完成从上传到自启动配置的全部流程。项目开源在GitHub:Yu-Xiang-Yang/deploy

1 背景与痛点

RK3588是一款高性能边缘计算芯片,在Buildroot系统下运行Python应用时,通常面临以下问题:

  • 设备无法联网:无法直接pip install,需要离线安装依赖
  • 部署步骤繁琐:每次更新代码都需要手动adb push、重启服务
  • 开机自启动配置复杂:需要手写init.d脚本并设置权限

本项目将这些步骤自动化,一条命令搞定。

2 项目结构

├── deploy.sh               # 一键部署脚本(Git Bash)
├── deploy.ps1              # 一键部署脚本(PowerShell)
├── download_packages.sh    # 自动下载离线依赖(Git Bash)
├── download_packages.ps1   # 自动下载离线依赖(PowerShell)
├── S99rk3588app            # init.d 自启动服务脚本
└── app/
    ├── main.py             # 应用程序入口(替换为你自己的)
    ├── requirements.txt    # Python 依赖列表(可选)
    └── packages/           # 离线 .whl 依赖包(自动下载)

3 前提条件

  • RK3588设备已通过USB连接,adb devices可识别
  • 设备上已安装Python3(/usr/bin/python3
  • 主机环境为Windows(PowerShell / Git Bash)或Linux/macOS

4 快速开始

4.1 克隆项目

git clone https://github.com/Yu-Xiang-Yang/deploy.git
cd deploy

4.2 放入你的应用

将你的Python程序放到app/目录下,入口文件命名为main.py

示例app/main.py

import time

while True:
    print("test", flush=True)
    time.sleep(10)

注意: print需要加flush=True,否则后台运行时日志不会实时写入。

4.3 一键部署

PowerShell(推荐):

.\deploy.ps1

如果提示脚本执行策略限制,先运行一次:

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

Git Bash:

bash deploy.sh

脚本会自动完成以下步骤:

  1. 检查ADB连接
  2. 停止旧服务
  3. 上传app/下所有文件到设备/data/rk3588app/
  4. 安装离线依赖包(如果app/packages/下有.whl文件)
  5. 安装自启动脚本到/etc/init.d/S99rk3588app
  6. 启动服务并验证

4.4 验证部署

# 查看服务状态
adb shell /etc/init.d/S99rk3588app status

# 查看日志
adb shell cat /data/rk3588app/app.log

5 离线安装Python依赖

RK3588设备通常无法联网,需要在电脑上提前下载.whl文件。

5.1 自动下载(推荐)

app/下创建requirements.txt,写入依赖:

requests
numpy==1.26.4

运行下载脚本,自动下载对应RK3588架构(aarch64 + Python 3.10)的.whl文件:

PowerShell:

.\download_packages.ps1

Git Bash:

bash download_packages.sh

下载完成后运行部署脚本,依赖会自动上传并安装到设备。

5.2 手动下载

也可以手动下载.whl文件放入app/packages/

pip download <包名> --platform linux_aarch64 --python-version 310 --only-binary=:all: -d app/packages/

如果pip download找不到对应平台的包,可以直接从PyPI手动下载对应cp310-linux_aarch64.whl文件。

5.3 版本兼容性问题

部分旧版本的包可能没有aarch64预编译文件,下载时会报错:

ERROR: No matching distribution found for psutil==5.8.0

解决方法:在requirements.txt中将==改为>=,允许下载更新的兼容版本:

psutil>=5.8.0

一般来说纯Python包(如pyserialsix)不受平台限制,带C扩展的包(如numpypsutil)需要注意版本是否提供了aarch64的预编译文件。

6 常用命令

操作 命令
启动服务 adb shell /etc/init.d/S99rk3588app start
停止服务 adb shell /etc/init.d/S99rk3588app stop
重启服务 adb shell /etc/init.d/S99rk3588app restart
查看状态 adb shell /etc/init.d/S99rk3588app status
查看日志 adb shell cat /data/rk3588app/app.log
清空日志 adb shell "> /data/rk3588app/app.log"

7 自定义配置

如需修改部署路径或服务名,编辑deploy.sh(或deploy.ps1)顶部的变量:

REMOTE_APP_DIR="/data/rk3588app"      # 设备上的应用目录
SERVICE_NAME="S99rk3588app"           # 服务脚本名称(数字越大启动越晚)

同时需要修改S99rk3588app中对应的路径。

8 原理说明

RK3588 Buildroot系统使用init.d管理开机启动服务。/etc/init.d/下以S开头的脚本会在系统启动时按编号顺序执行。

8.1 自启动脚本核心逻辑

S99rk3588app通过start-stop-daemon将Python程序以后台进程运行,并将stdout/stderr重定向到日志文件:

case "$1" in
  start)
    printf "Starting rk3588app: "
    sleep 3
    start-stop-daemon -S -b -m -p $PIDFILE \
      --exec /bin/sh -- -c "exec $DAEMON $SCRIPT >> $LOGFILE 2>&1"
    echo "OK"
    ;;
  stop)
    printf "Stopping rk3588app: "
    start-stop-daemon -K -p $PIDFILE
    rm -f $PIDFILE
    echo "OK"
    ;;
esac

8.2 启动顺序

脚本名称中S后面的数字决定启动顺序,数字越小越先执行:

S00mountall.sh   → 挂载文件系统
S10udev          → 设备管理
S40network       → 网络
S50sshd          → SSH 服务
S99rk3588app     → 你的应用(最后启动)

S99确保在网络、串口等系统服务就绪后才启动应用。如需更早启动,改小数字即可(如S50rk3588app),但一般建议保持S99

9 项目地址

GitHub: https://github.com/Yu-Xiang-Yang/deploy

欢迎Star和提Issue。

评论