如何为GPS数据处理Python应用编写Yocto配方?
嘿,我来帮你一步步搞定这个Yocto配方的编写!其实Python应用的配方思路和Node.js的挺像,只是细节上适配Python生态而已,咱们慢慢拆解:
编写你的GPS Python应用Yocto配方
1. 先理清依赖的处理逻辑
首先明确两个核心点:
- 对于meta-python层已经提供的包(比如你找到的
python3-pyserial),直接通过Yocto的系统依赖机制引入就行,不用再走pip安装 - 对于meta-python没有的包(
pynmea2、influxdb以及它们的附属依赖),我们可以用Yocto的pip3_install机制来安装这些PyPI包
2. 创建基础配方文件
在你的自定义layer里新建一个配方文件,比如recipes-devtools/python/python-my-gps-app_0.1.bb(版本号可以根据你的应用调整),先填充基础字段:
SUMMARY = "GPS数据采集与InfluxDB存储应用" DESCRIPTION = "读取GPS信息、解析并存储到InfluxDB的Python应用" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" # 指定使用Python3 PYTHON = "python3" # 继承必要的类,支持Python3和pip操作 inherit python3native python3pip
3. 处理两类依赖
系统级依赖(meta-python已提供)
因为pyserial在meta-python里有现成的python3-pyserial包,直接添加到编译和运行依赖中:
# 编译阶段依赖(确保编译环境能调用相关工具) DEPENDS += "python3-pyserial-native" # 目标系统运行时必须的依赖 RDEPENDS_${PN} += "python3-pyserial"
PyPI包依赖(meta-python缺失的)
接下来处理pynmea2、influxdb以及它们的附属依赖,我们可以直接复用你本地测试过的版本列表,确保环境一致:
# 定义需要安装的PyPI包及对应版本,和你本地pip freeze的结果匹配 PYPI_PACKAGES = "\ certifi==2018.4.16 \ chardet==3.0.4 \ idna==2.6 \ influxdb==5.0.0 \ pynmea2==1.12.0 \ python-dateutil==2.7.3 \ pytz==2018.4 \ requests==2.18.4 \ six==1.11.0 \ urllib3==1.22 \ " # 安装阶段:先部署自己的应用代码,再安装PyPI依赖 do_install() { # 创建应用存放目录 install -d ${D}${PYTHON_SITEPACKAGES_DIR}/my_gps_app # 把你的Python脚本复制到目标目录(如果是多文件可以用cp -r ${S}/* ...) install -m 0755 ${S}/your_gps_main_script.py ${D}${PYTHON_SITEPACKAGES_DIR}/my_gps_app/ # 安装PyPI依赖到目标系统的Python站点目录 pip3 install --no-index --find-links=${WORKDIR}/pypi-packages ${PYPI_PACKAGES} -t ${D}${PYTHON_SITEPACKAGES_DIR} } # 预下载阶段:提前把所有PyPI包下载到本地,避免编译时联网 do_fetch() { mkdir -p ${WORKDIR}/pypi-packages # 用pip批量下载指定版本的包到本地目录 pip3 download ${PYPI_PACKAGES} -d ${WORKDIR}/pypi-packages }
4. 实用优化技巧
- 添加可执行入口:如果想把应用做成系统命令,可以在
do_install里加一段:install -d ${D}${bindir} cat > ${D}${bindir}/run-gps-app <<EOF #!/usr/bin/env python3 from my_gps_app.your_gps_main_script import main main() EOF chmod 0755 ${D}${bindir}/run-gps-app - 避免版本冲突:比如
requests这类包,meta-python可能也有提供,如果版本兼容,你可以去掉PyPI列表里的requests,换成系统包依赖:RDEPENDS_${PN} += "python3-requests" - 离线编译适配:如果不想每次编译都下载包,可以把
do_fetch下载好的包放到layer的files目录,然后把find-links改成${S}/files,再把包添加到配方的SRC_URI里。
5. 验证配方
把你的配方加到local.conf的镜像安装列表里:
IMAGE_INSTALL_append = " python-my-gps-app"
然后编译镜像或者单独编译配方:bitbake python-my-gps-app,检查编译日志有没有报错,烧录镜像后就能在目标板上运行你的应用啦。
内容的提问来源于stack exchange,提问作者user4851126
相关产品推荐
相关产品推荐

