树莓派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
相关产品推荐
相关产品推荐

