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

Raspberry Pi动物跑轮测速脚本报feet_traveled未定义错误

问题背景

使用树莓派采集动物跑轮运动数据(含累计行进距离、实时运动速度等指标),运行采集脚本时触发变量未定义报错,已确认脚本内单圈轮动对应行进距离参数设置为2.095英尺,无法定位报错原因。

触发的报错信息如下:

Traceback (most recent call last):   File "/home/pi/wheel.py", line 55, in <module>
miles_traveled =  float (feet_traveled) / 5280 NameError: name 'feet_traveled' is not defined
报错根因

这个报错和单圈距离参数设置无关,问题出在脚本启动阶段的初始化流程:

  • 脚本开头读取/home/pi/current_count历史计数文件的逻辑没有做任何异常兜底:第一次运行脚本时这个计数文件根本不存在,open()操作会直接抛出文件不存在错误,后续给feet_traveled、high_mph等变量赋值的代码完全不会执行,进入主循环时自然找不到对应变量
  • 就算计数文件存在,如果文件内容被意外损坏、存在空行、存储的不是合法数字,float(file.readline())类型转换时也会抛错,同样会中断变量初始化流程
  • 额外注意:现有脚本用的是Python2的无括号print语法,如果系统默认Python版本为3.x,启动时会先触发print语法错误,也会导致初始化流程中断,触发相同的未定义报错。
排查步骤
  • 先确认运行环境的Python版本:终端执行python --version,如果返回3.x版本,需要先把脚本内所有print语句修改为Python3兼容的带括号格式
  • 检查计数文件是否存在:终端执行ls /home/pi/current_count,如果提示文件不存在,可直接使用后续提供的带自动初始化逻辑的修复代码
  • 如果文件存在,执行cat /home/pi/current_count查看内容,正常格式应为三行:第一行是累计行进英尺数(浮点数)、第二行是历史最高速度(浮点数)、第三行是最高速度对应的时间字符串,缺行、内容格式不符都会导致读值失败。
修复方案

将脚本开头读取计数文件的代码段替换为以下带异常兜底的版本,无论文件是否存在、内容是否损坏,都能正常完成变量初始化:

import RPi.GPIO as GPIO
import time
from time import sleep
import os

GPIO.setmode(GPIO.BCM)
GPIO.setup(6, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# 预先给所有计数变量赋默认初始值
feet_traveled = 0.0
high_mph = 0.0
max_mph_time = "暂无记录"

# 安全读取历史计数,读失败直接使用默认值,不中断脚本运行
count_file_path = "/home/pi/current_count"
if os.path.exists(count_file_path):
    try:
        with open(count_file_path, "r") as f:
            lines = [line.strip() for line in f.readlines() if line.strip()]
            if len(lines) >= 3:
                feet_traveled = float(lines[0])
                high_mph = float(lines[1])
                max_mph_time = lines[2]
    except:
        pass

prev_time = 0
mark_time = 0
prev_feet_traveled = 0
mph = 0

如果使用Python3运行脚本,还需要将所有print语句修改为带括号的兼容格式,例如回调函数内的三行输出修改为:

print(f'Feet per second  = {fps}')
print(f'MPH = {mph}')
print(f'Highest MPH {high_mph}')

主循环内的距离输出语句修改为:

print(f"Distance traveled is {feet_traveled:,.1f} feet or {miles_traveled:.3f} miles")

额外优化:原脚本打开计数文件后未主动关闭文件句柄,修复版使用with语句自动管理文件资源,不会出现文件被占用无法写入的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:03:36