吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2838|回复: 10
收起左侧

[已解决] python定时执行一段代码

[复制链接]
吾爱破jie 发表于 2019-12-10 09:27
本帖最后由 吾爱破jie 于 2019-12-10 19:46 编辑

我用python写了一个用摄像头拍摄照片,并将照片上传到服务器上的功能。每隔一段时间就执行一次。
当我每个一分钟执行一次,他能一直保持后台运行。但是当我设置为一个小时运行一次的时候,程序就运行了第一次,后面就不运行了,因为我设置的是开机自启自动运行,所有没有返回任何信息,不知道怎么回事。
代码特别简单,请问在哪里可以改进一下。
[Python] 纯文本查看 复制代码
#-*-coding:UTF-8-*-
from picamera import PiCamera
import datetime,time,paramiko,pymysql,os


time.sleep(60) # waiting for network connection


# host是阿里云服务器ip地址,port是阿里云中数据库的端口号,user和passwd是经阿里云MySQL授权过的可远程连接的帐号和密码,db是数据库
# 若加了charset='utf8',则最上方要加上#-*-coding:UTF-8-*-
conn = pymysql.connect(host = '',port = ,user = '',passwd = '',db = '',charset='utf8')
cur = conn.cursor()


# 连接阿里云服务器的一般操作
transport = paramiko.Transport(('',22))
transport.connect(username='',password='')
sftp = paramiko.SFTPClient.from_transport(transport)


camera = PiCamera()
img_cycle = 3600 #定义图像周期


# 拍摄图片,并用当前时间命名存储到指定位置
def get_img(now):
    camera.capture('/home/pi/Pictures/%s.jpg' %now)
    

# 上传图像    
def upload_img(now):    
    sftp.put('/home/pi/Pictures/%s.jpg' %now,'/root/images/%s.jpg' %now)
    

# 删除图像
def delete_img(now):
    os.remove('/home/pi/Pictures/%s.jpg' %now)


# 上传图片路径到阿里数据库
def img_mysql(now):
    ali_directory = str('/root/images/%s.jpg' %now)
    sql = "INSERT INTO images(images_directory,submission_date) VALUES('"+ali_directory+"',now())"
    cur.execute(sql)
    conn.commit()


# 录制视频
def get_videos(now):
    camera.start_recording('/home/pi/Videos/%s.h264' %now)
    time.sleep(10)
    camera.stop_recording()


# 上传视频
def upload_videos(now):
    sftp.put('/home/pi/Videos/%s.h264' %now,'/root/videos/%s.h264' %now)


# 删除视频
def delete_videos(now):
    os.remove('/home/pi/Videos/%s.h264' %now)
    

# 上传视频路径到阿里数据库
def videos_mysql(now):
    ali_directory = str('/root/videos/%s.h264' %now)
    sql = "INSERT INTO videos(videos_directory,submission_date) VALUES('"+ali_directory+"',now())"
    cur.execute(sql)
    conn.commit()


while 1:
    now_img = datetime.datetime.now().strftime('%Y%m%d_%Hh%Mm%Ss') # 获取当前时间
    get_img(now_img)
    upload_img(now_img)
    time.sleep(5) # 延迟五秒,以防崩溃
    delete_img(now_img)
    img_mysql(now_img)
    print('已执行图像')
    
    time.sleep(5)
    
    now_videos = datetime.datetime.now().strftime('%Y%m%d_%Hh%Mm%Ss') # 获取当前时间
    get_videos(now_videos)
    upload_videos(now_videos)
    delete_videos(now_videos)
    time.sleep(5) # 延迟五秒,以防崩溃
    videos_mysql(now_videos)
    print('已执行视频')
    
    time.sleep(img_cycle)

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

whh19921024 发表于 2019-12-10 09:40
估计是某个地方抛异常了,用try捕获下,免得崩溃。
mo_zhoupxi 发表于 2019-12-10 09:45
在上传图像之前应该做一下连接服务器的操作吧,不然一个小时你跟服务器还保持着连接吗?
lcchd6 发表于 2019-12-10 10:11
不要用WHILE.
2个建议,
1 、用  schedule
2、 用WINDOWS 计划任务 ,或者LINUX的定时任务 ,反复执行就好了。  (推荐,我现在就是偷懒用这个)

下面给一段以前自动邮件+附件的定时schedule的代码, 代码没问题,以前跑过一段时间, 你把多线程去掉就行了。
[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
# [url=home.php?mod=space&uid=238618]@Time[/url]    : 2018/8/29 14:30
# [url=home.php?mod=space&uid=686208]@AuThor[/url]  : lio
# @FileName: Startloop.py
# @Software: PyCharm
#@Desc :   该定时任务已完成, 可以定时执行对应的PY脚本,暂时不使用该定时器。
#

import threading
import schedule
import datetime
import time
import SendmailsTest as SM
import Logs



def task1():
    print("我开始1了。")
    threading.Thread(target=SM.startjobXJX('测试')).start()
def task2():
    print("我开始2了。")
    threading.Thread(target=SM.startjobJSQB('测试')).start()


def run():
    jobtimemorning = "09:00"
    jobtimenoon = "16:10"
    jobtimenight = "18:00"
    iwillsleep = 6
    schedule.every(1).day.at(jobtimemorning).do(task1)
    schedule.every(1).day.at(jobtimemorning).do(task2)

    schedule.every(1).day.at(jobtimenoon).do(task1)
    schedule.every(1).day.at(jobtimenoon).do(task2)

    schedule.every(1).day.at(jobtimenight).do(task1)
    schedule.every(1).day.at(jobtimenight).do(task2)

    print("多线程计划任务 - Running...")
    while True:
        logs="多线程计划任务准备就绪。 每日"+jobtimemorning+jobtimenoon+jobtimenight +"执行.  休眠:"+str(iwillsleep)+"秒"
        Logs.logging.info(logs)
        schedule.run_pending()
        time.sleep(iwillsleep)
try:
    run()
except Exception as e:
    print("多线程定时器错误:" + e)
    Logs.logging.info(e)



# 定时案例
# schedule.every(10).minutes.do(job)
# schedule.every().hour.do(job)
# schedule.every(1).day.at("10:30").do(job)
# schedule.every(5).to(10).days.do(job)
# schedule.every().monday.do(job)
# schedule.every().wednesday.at("13:15").do(job)
# schedule.every(13).seconds.do(task1)
# schedule.every(1).minutes.do(task1)

头像被屏蔽
cszwjwzq1 发表于 2019-12-10 10:12
提示: 作者被禁止或删除 内容自动屏蔽
wdxm2008 发表于 2019-12-10 10:18
我也觉得是连接问题
小冷ice 发表于 2019-12-10 10:23
值得一试,谢谢分享
 楼主| 吾爱破jie 发表于 2019-12-10 10:32
mo_zhoupxi 发表于 2019-12-10 09:45
在上传图像之前应该做一下连接服务器的操作吧,不然一个小时你跟服务器还保持着连接吗?

有可能,谢谢提醒。
 楼主| 吾爱破jie 发表于 2019-12-10 10:33
lcchd6 发表于 2019-12-10 10:11
不要用WHILE.
2个建议,
1 、用  schedule

谢了,我学习学习
水尚人家 发表于 2019-12-10 11:08
学习了,谢谢了!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-13 13:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表