Python采用Dos执行命令方式定时运行py程序

前段时间我制作了笔记本利用Python自动拍摄照片并判断明亮度后按时间保存-CSDN博客 的py程序用于利用笔记本长期为自己监控笔记本前面的情况。运行一段时间时发现该程序内存泄漏,每5分钟增加几m的内存占用,用了很多方法都无法解决这个问题。所有对于有内存强迫症的我,就非常不舒服,用一二天就把他关闭重启。

今天,我突然有一个想法,我可以用我平时用dos命令运行py程序的方法,5分钟执行一次,每一次就只拍一张照片。分开写2个py程序,一个是拍照的程序,一个是定时运行拍照的程序。

拍照程序:

# -*- coding: utf-8 -*-
"""
Created on Thu Jun  6 08:09:26 2024

@author: YBK
"""
import cv2
import os

import datetime
from PIL import Image



# 设置拍照参数
frame_width = 960
frame_height = 540
# 初始化摄像头
cap = cv2.VideoCapture(0)  # 0 通常是默认摄像头的标识

# 检查摄像头是否成功打开
if not cap.isOpened():
    print("无法打开摄像头")
    exit()

cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)
now = datetime.datetime.now()
filename = str(now).replace('-','').replace(':','').replace(' ','').replace('2024','').split('.')[0]
date_str = now.strftime("%Y%m%d")
date_path = 'e:\\sxtpz\\' + date_str
# 读取一帧图像
ret, frame = cap.read()
 
# 如果成功读取图像,进行保存
if ret:        
    frame1 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    img = Image.fromarray(frame1)
    gray_img = img.convert('L')
    # 计算平均亮度
    # gray_img.show()
    avg_brightness = sum(gray_img.getdata()) / (gray_img.width * gray_img.height)
    # print(avg_brightness)
    del(gray_img)
    del(img)
    if avg_brightness < 30:
        print("照片是黑暗的,不保存")
    else:
        if os.path.exists(date_path):
            pass
        else:
            print("创建文件夹")
            os.makedirs(date_path, exist_ok=True)
        cv2.imwrite(date_path + '\\' + filename + '.jpg', frame)  # 保存图片为'snapshot.jpg'
        print("照片已保存:" + filename + '.jpg')
else:
    print("无法拍照")
 
# 释放摄像头
del(ret)
del(frame)
del(frame1)
cap.release()
cap = None
cv2.destroyAllWindows()

每5分钟运行上面的程序:

# -*- coding: utf-8 -*-
"""
Created on Mon Aug 12 12:36:25 2024

@author: YBK
"""

from apscheduler.schedulers.blocking import BlockingScheduler
import subprocess

def rundos():
    command = 'conda activate python38'
    try:
        result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        if result.returncode == 0:
            print('38ok ' + result.stdout)
        else:
            print('38err ' + result.stderr)
    except Exception as e:
        print(f'发生异常:{e}')
    command1 = 'python E:\.spyder-py3\拍照.py'
    try:
        result = subprocess.run(command1, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        if result.returncode == 0:
            print('ok ' + result.stdout)
        else:
            print('err ' + result.stderr)
    except Exception as e:
        print(f'发生异常:{e}')
        
rundos()
sched = BlockingScheduler()
sched.add_job(rundos, 'interval', minutes=5,)
sched.start()

这样运行下来,该程序平时就只有占用50多m内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值