Raspbian下VSCode内置终端与普通终端运行Python结果不同问题
问题根因
报错本质是openMainJSON函数实际返回了字符串"error",而非预期的字典,触发原因有两个:
- 执行路径不一致:VSCode内置终端执行脚本时,当前工作目录默认是脚本所在的项目目录,
open("itemsToLookFor.JSON")可以正常找到目标文件;但crontab执行定时任务时,默认工作目录是执行用户的家目录(树莓派默认pi用户的家目录是/home/pi),无法通过相对路径找到项目下的JSON文件,触发读取异常。 - 异常捕获逻辑缺陷:使用了无差别的裸
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
相关产品推荐
相关产品推荐

