树莓派Python3用logging写日志触发两类报错的排查与解决
报错原因拆解
- 第一类
FileNotFoundError触发原因- Python 3.7版本的
logging模块在配置文件日志时,FileHandler逻辑仅会直接尝试打开最终指定的日志文件,不会自动递归创建路径中缺失的上级目录。从堆栈信息可以看到,实际运行的test.py第641行,明确指定日志目标是/var/log/morning/RER-execution-logs.txt,只要/var/log/morning这层目录不存在,模块就会直接抛出文件不存在的错误。 - 你最初看到的日志配置语句写的路径是
/Desktop/var/log/...,本质是绝对路径写法错误:以斜杠开头的路径会直接从系统根目录开始匹配,既不会找到你桌面上的内容,也不会自动拼接/home/pi的用户路径,这也是你实际运行时看不到对应日志写入桌面的核心原因。
- Python 3.7版本的
- 第二类
PermissionError触发原因
树莓派系统默认将/var/log设为系统级日志专属目录,目录本身归属root用户、配置了严格的读写权限管控。你能手动在该目录下创建morning子目录,基本是通过sudo临时提权完成操作的,此时创建出来的目录、后续生成的日志文件属主都是root;而你日常运行Python脚本时使用的是普通pi用户身份,没有root属主目录的写入权限,因此触发权限拒绝报错。
对应解决方案
- 方案1(最省事,无额外权限配置):更换日志存储路径
把日志文件改到当前登录用户有完全读写权限的家目录下,比如/home/pi/Desktop/RER-execution-logs.txt,从根源避开系统目录的权限限制。
注意路径写法不要出错:不要写绝对路径/Desktop/xxx,正确的桌面路径必须带上家目录前缀/home/pi/,否则系统还是会从根目录匹配不存在的/Desktop文件夹。 - 方案2(保留/var/log存储路径,无需每次提权跑脚本):调整日志目录归属
通过命令预先完成目录创建和权限调整,让普通用户对专属日志目录有写入权限:- 创建日志目录:
sudo mkdir -p /var/log/morning - 将目录属主修改为日常运行脚本的普通用户:
sudo chown pi:pi /var/log/morning(树莓派默认普通用户为pi,执行该命令即可)
- 创建日志目录:
- 方案3(代码层面规避,避免手动建目录):配置日志前自动创建父目录
不管最终选择哪个存储路径,都可以在logging.basicConfig之前加入目录创建逻辑,从代码层面避免路径缺失问题,示例代码:import os import logging log_target = "/var/log/morning/RER-execution-logs.txt" # 递归创建日志文件的上级目录,目录已存在时不触发报错 os.makedirs(os.path.dirname(log_target), exist_ok=True) logging.basicConfig( filename=log_target, format='%(levelname)s:%(asctime)s:%(message)s', level=logging.INFO ) - 临时应急方案:运行脚本时加
sudo提权,以root身份执行脚本即可获得/var/log目录的写入权限,但不推荐长期使用,过高的运行权限可能带来不必要的安全风险。
内容的提问来源于stack exchange,提问作者w1ll
相关产品推荐
相关产品推荐

