SSH远程执行Python脚本触发IndexError: list index out of range问题排查
你遇到的IndexError: list index out of range错误,本质是脚本尝试读取lines[-1](文件最后一行)时,lines是空列表——说明通过SSH执行时,selected_node.py要么没找到temp.txt,要么读取到了空文件。下面逐个拆解可能的原因和解决办法:
1. 相对路径导致文件找不到
如果你的selected_node.py里用相对路径读取temp.txt(比如open('temp.txt', 'r')),就可能踩坑:通过SSH执行命令时,远程的工作目录不一定是/home/pi。虽然SSH登录默认进入用户家目录,但如果本地发起命令时处于其他目录,或者脚本没有明确切换到文件所在路径,open()会在当前工作目录创建一个空的temp.txt,最终导致读取到空内容。
解决办法:改用绝对路径打开文件,确保无论执行环境如何都能定位到正确的文件:
with open('/home/pi/temp.txt', 'r') as f: lines = f.readlines()
2. 采集脚本写入时的竞态条件
你的采集脚本每2分钟写入temp.txt,如果它的写入逻辑是先清空文件再写入(比如用open('temp.txt', 'w')模式),那当SSH执行selected_node.py的时机刚好赶上采集脚本清空文件、还没写入新内容的瞬间,就会读取到空文件,触发索引错误。
解决办法:
- 调整采集脚本的写入方式:用追加模式(
open('temp.txt', 'a')),或者先写入临时文件,再替换原文件(避免原文件出现空状态); - 在
selected_node.py里增加异常处理,空文件时重试读取:
import time def get_last_temp(): while True: with open('/home/pi/temp.txt', 'r') as f: lines = f.readlines() if lines: return lines[-1].strip() print("Temp file is empty, retrying in 2s...") time.sleep(2) last_line = get_last_temp()
3. SSH执行时的权限问题
虽然你用pi用户登录,但要确认temp.txt的权限是否允许pi读取。可以通过SSH执行以下命令检查:
ssh -p 22 -i pi.rsa pi@192.168.1.xx ls -l /home/pi/temp.txt
如果输出里的权限不是-rw-r--r--或-rw-------(只要pi用户有读权限即可),就调整权限:
ssh -p 22 -i pi.rsa pi@192.168.1.xx chmod 644 /home/pi/temp.txt
先通过SSH直接查看temp.txt的内容,确认文件存在且有数据:
ssh -p 22 -i pi.rsa pi@192.168.1.xx cat /home/pi/temp.txt
如果能正常输出温度数据,就可以排除路径和权限问题,大概率是采集脚本写入时的竞态条件导致的。
内容的提问来源于stack exchange,提问作者user10586757

