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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:16:47