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

Raspbian下VSCode内置终端与普通终端运行Python结果不同问题

问题根因

报错本质是openMainJSON函数实际返回了字符串"error",而非预期的字典,触发原因有两个:

  1. 执行路径不一致:VSCode内置终端执行脚本时,当前工作目录默认是脚本所在的项目目录,open("itemsToLookFor.JSON")可以正常找到目标文件;但crontab执行定时任务时,默认工作目录是执行用户的家目录(树莓派默认pi用户的家目录是/home/pi),无法通过相对路径找到项目下的JSON文件,触发读取异常。
  2. 异常捕获逻辑缺陷:使用了无差别的裸except捕获所有异常,文件不存在、JSON格式错误、权限不足等所有问题都会被吞掉,直接返回字符串"error",后续代码对字符串做字典式的键索引,就会抛出你看到的类型错误,真正的原始错误被完全隐藏。

另外注意树莓派运行的Linux系统是文件名大小写敏感的,如果你的JSON文件实际后缀是小写.json,代码里写的大写.JSON也会导致文件找不到,这个问题在Windows/macOS下不会触发,也是跨环境运行常见的坑。

修复方案

按优先级做以下调整即可:

  • 优先把文件读取路径改成基于脚本位置的绝对路径,彻底规避工作目录不一致的问题,同时修正不规范的异常捕获,修改后的openMainJSON参考代码:
import os
import json

def openMainJSON(filename):
    try:
        # 获取当前脚本本身所在的文件夹绝对路径
        script_path = os.path.dirname(os.path.abspath(__file__))
        # 拼接JSON文件的完整绝对路径
        full_file_path = os.path.join(script_path, f"{filename}.JSON")
        # 用with上下文管理安全打开文件,指定编码避免乱码
        with open(full_file_path, "r", encoding="utf-8") as f:
            data = json.load(f)
        return data
    except Exception as e:
        # 打印具体错误信息方便排查,不要静默吞错
        print(f"加载JSON文件失败,错误详情:{e}")
        # 出错直接抛出异常终止流程,不要返回字符串和正常返回值混用
        raise
  • 如果不想修改代码逻辑,也可以调整crontab的执行命令,先切换到项目目录再执行脚本,示例:
    原来的crontab配置(错误示例):
    */10 * * * * python3 /home/pi/your_project/run_scraper.py
    
    修改后:
    */10 * * * * cd /home/pi/your_project && python3 run_scraper.py
    
  • 额外检查JSON文件的文件名、后缀大小写,确保和代码里写的完全一致,同时给脚本执行用户配置JSON文件的读权限,避免权限不足导致的读取失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:01:10