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
相关产品推荐
相关产品推荐

