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

树莓派3延时摄影Python脚本内存泄漏问题求助

解决树莓派延时摄影脚本内存泄漏问题

看起来你的问题核心是picamera库在频繁调用时的内存泄漏——即使使用了官方推荐的with语句,底层仍有未完全释放的资源,导致内存持续攀升,最终相机因内存不足无法工作。下面给你几个针对性的解决方案,按优先级排序:

1. 改用官方命令行工具raspistill替代picamera库

这是最可靠的解决办法,raspistill是树莓派官方维护的相机工具,经过充分测试,内存管理更稳定,不会出现Python层面的泄漏问题。

修改你的ShutterTimestamp.py脚本,替换掉picamera相关代码:

import subprocess
import time
import os

def ShutterTS(dirname):
    # 生成带时间戳的文件名
    FNfmt = "%Y%m%d_%H:%M:%S.JPG"
    Fname = time.strftime(FNfmt)
    framename = os.path.join(dirname, Fname)
    
    # 调用raspistill执行拍照
    try:
        subprocess.run([
            'raspistill',
            '-w', '1920',      # 照片宽度
            '-h', '1440',      # 照片高度
            '-rot', '180',     # 旋转180度
            '-hf',             # 水平翻转
            '-o', framename,   # 输出文件路径
            '-t', '2000'       # 相机预热时间(毫秒)
        ], check=True, capture_output=True)
    except subprocess.CalledProcessError as e:
        # 写入错误日志方便排查
        with open('/home/pi/timelapse_errors.log', 'a') as f:
            f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')}拍照失败: {e.stderr.decode()}\n")
    return

def main():
    dirname = "/你的照片存储路径"  # 替换成你的实际路径
    ShutterTS(dirname)
    return

if __name__ == '__main__':
    import sys
    sys.exit(main())

每次调用raspistill都是一个独立的系统进程,运行结束后会被操作系统彻底回收内存,不会有残留问题。

2. 排查cron脚本的进程退出问题

确认你的cron调用脚本是否会因为异常而挂起,导致僵尸进程占用内存。可以在main函数中添加异常捕获,确保脚本无论是否出错都能正常退出:

def main():
    try:
        dirfmt = "%Y%m%d"  # 按日期生成文件夹,根据你的实际格式调整
        dirname = time.strftime(dirfmt)
        FPM = gettimes()
        if FPM > 0:
            testmakedir(dirname)
            Timer(dirname, FPM)
    except Exception as e:
        # 记录主脚本错误日志
        with open('/home/pi/timelapse_main_errors.log', 'a') as f:
            f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')}主脚本错误: {str(e)}\n")
    return

你可以用ps aux | grep python命令检查是否有残留的Python进程,如果有,说明脚本没有正常退出,需要进一步排查gettimes()或testmakedir()函数中的逻辑问题。

3. 关于内存占用的补充说明

你提到的内存缓存相关内容是对的——top显示的内存占用包含系统缓存,free -m中的available才是真正可用的内存。但相机模块对内存的要求比较特殊,它需要连续的物理内存块,即使系统有空闲内存,如果被碎片化的缓存占用,也可能导致相机无法申请到足够的内存。改用raspistill后,这个问题也会得到缓解,因为它的内存分配方式更适配相机硬件。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:02:01