在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)
注意:
flush=True,否则后台运行时日志不会实时写入。
4.3 一键部署
PowerShell(推荐):
.\deploy.ps1
如果提示脚本执行策略限制,先运行一次:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
Git Bash:
bash deploy.sh
脚本会自动完成以下步骤:
- 检查ADB连接
- 停止旧服务
- 上传
app/下所有文件到设备/data/rk3588app/ - 安装离线依赖包(如果
app/packages/下有.whl文件) - 安装自启动脚本到
/etc/init.d/S99rk3588app - 启动服务并验证
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包(如pyserial、six)不受平台限制,带C扩展的包(如numpy、psutil)需要注意版本是否提供了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。