当前位置: 首页 > news >正文

python 定时任务管理封装

ba9020c2dabe42aaa508da75e09c2c07.png

主逻辑代码

# -*- coding: utf-8 -*-
# import apscheduler
import  pandas as pd
from datetime import datetime
# 导入调度器,此处使用BackgroundScheduler阻塞调度器
from apscheduler.schedulers.background import BackgroundScheduler
# 导入触发器,此处使用IntervalTrigger特定时间间隔触发
from apscheduler.triggers.interval import IntervalTrigger
from apscheduler.triggers.cron import CronTrigger
from apscheduler.triggers.date import DateTrigger
from apscheduler.executors.pool import ThreadPoolExecutor,ProcessPoolExecutor
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.util import undefined
import os,time,sys,random,copy,json
from QhTestJob import Ui_Form
from PyQt5.QtWidgets import QApplication
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt# cron定时调度(某一定时时刻执行)
# (int|str) 表示参数既可以是int类型,也可以是str类型
# (datetime | str) 表示参数既可以是datetime类型,也可以是str类型
# year (int|str) – 4-digit year -(表示四位数的年份,如2008年)
# month (int|str) – month (1-12) -(表示取值范围为1-12月)
# day (int|str) – day of the (1-31) -(表示取值范围为1-31日)
# week (int|str) – ISO week (1-53) -(格里历2006年12月31日可以写成2006年-W52-7(扩展形式)或2006W527(紧凑形式))
# day_of_week (int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun) - (表示一周中的第几天,既可以用0-6表示也可以用其英语缩写表示)
# hour (int|str) – hour (0-23) - (表示取值范围为0-23时)
# minute (int|str) – minute (0-59) - (表示取值范围为0-59分)
# second (int|str) – second (0-59) - (表示取值范围为0-59秒)
# start_date (datetime|str) – earliest possible date/time to trigger on (inclusive) - (表示开始时间)
# end_date (datetime|str) – latest possible date/time to trigger on (inclusive) - (表示结束时间)
# timezone (datetime.tzinfo|str) – time zone to use for the date/time calculations (defaults to scheduler timezone) -(表示时区取值)#  interval 间隔调度(每隔多久执行)
# weeks (int) – number of weeks to wait
# days (int) – number of days to wait
# hours (int) – number of hours to wait
# minutes (int) – number of minutes to wait
# seconds (int) – number of seconds to wait
# start_date (datetime|str) – starting point for the interval calculation
# end_date (datetime|str) – latest possible date/time to trigger on
# timezone (datetime.tzinfo|str) – time zone to use for the date/time calculations# date 定时调度(作业只会执行一次)
# run_date (datetime|str) – the date/time to run the job at  -(任务开始的时间)
# timezone (datetime.tzinfo|str) – time zone for run_date if it doesn’t have one already
def QhRR(QhVALUE,QhVALUE1):print("{}--{}执行定时任务...".format(QhVALUE,QhVALUE1))class QhApscheduler():QhFiled = {"QhJabId": "None",            # 任务ID"QhJabName": "None",          # 任务名称"QhJabFuncName": "None",      # 任务名称 执行的程序名"QhTimesType": "None",        # 任务类型  重复 间隔 一次"QhYear": "None",             # 年"QhMonth": "None",            # 月"QhDay": "None",              # 日"QhWeek": "None",             # 周"QhDayOfWeek": "None",        # 星期几"QhHour": "None",             # 小时"QhMinute": "None",           # 分钟"QhSecond": "None",           # 秒钟"QhJabArgs": "None",          # 任务参数  函数参数"QhJabKwargs": "None",        # 任务参数  函数参数"QhJabStartDate": "None",     # 开始时间"QhJabNextRunTime": "None",   # 下次运行时间"QhJabLastRunTime": "None",    # 上次运行时间"QhJabStatus": "None"         # 任务状态 }def __init__(self, *args, **kwargs):self.QhCheduPath = os.path.dirname(os.path.abspath(__file__))         #绝对路径 用于获取定时模块的根目录print(self.QhCheduPath)self.QhCheduPoolJobDf = self._QhinitJobPoolCsv()QhExecutors = {'default':ThreadPoolExecutor(20),'processpool':ProcessPoolExecutor(10)}self.QhJobstores = {'default': SQLAlchemyJobStore(url='sqlite:///QhJobPoolDb/QhJabSqlite.sqlite')}self.Qhscheduler = BackgroundScheduler(jobstores=self.QhJobstores,executors=QhExecutors,misfire_grace_time=3,coalescing=True)self.Qhscheduler.start()self._QhInitAddJobFor()def _QhInitAddJobFor(self,QhIsFor = True):if self.QhCheduPoolJobDf.shape[0] == 0: returnfor QhInx,QhRow in self.QhCheduPoolJobDf.iterrows():QhJabId = QhRow["QhJabId"]QhJabName = QhRow["QhJabName"]QhJabFuncName = QhRow["QhJabFuncName"]QhTimesType = QhRow["QhTimesType"]QhYear = self.QhGeShiZH(QhRow["QhYear"])QhMonth = self.QhGeShiZH(QhRow["QhMonth"])QhDay = self.QhGeShiZH(QhRow["QhDay"])QhWeek = self.QhGeShiZH(QhRow["QhWeek"])QhDayOfWeek = self.QhGeShiZH(QhRow["QhDayOfWeek"])QhHour = self.QhGeShiZH(QhRow["QhHour"])QhMinute = self.QhGeShiZH(QhRow["QhMinute"])QhSecond = self.QhGeShiZH(QhRow["QhSecond"])QhJabArgs = self.QhGeShiZH(QhRow["QhJabArgs"])QhJabKwargs = self.QhGeShiZH(QhRow["QhJabKwargs"])       QhJabStartDate = QhRow["QhJabStartDate"]QhJabNextRunTime = QhRow["QhJabNextRunTime"]# QhJabLastRunTime = QhRow["QhJabLastRunTime"]# QhJabEndDate = QhRow["QhJabEndDate"]QhJabStatus = self.QhGeShiZH(QhRow["QhJabStatus"])print(QhYear,QhMonth,QhDay,QhWeek,QhDayOfWeek,QhHour,QhMinute,QhSecond)print(type(QhYear),type(QhMonth),type(QhDay),type(QhWeek),type(QhDayOfWeek),type(QhHour),type(QhMinute),type(QhSecond))self.QhAddJob(QhJabId,QhTimesType=QhTimesType,QhJabFuncName = QhJabFuncName,QhJabArgs=QhJabArgs,QhJabKwargs=QhJabKwargs,QhName = QhJabName,QhYear = QhYear,QhMonth = QhMonth,QhDay = QhDay,QhWeek = QhWeek,QhDayOfWeek = QhDayOfWeek,QhHour = QhHour,QhMinute = QhMinute,QhSecond = QhSecond,QhIsFor = QhIsFor,QhJabStatus=QhJabStatus)# QhIsFor当为True时,保存到csv文件,批量增加时的场景if QhIsFor == True:self.QhCheduPoolJobDf.to_csv(self.QhCheduPoolJobCsv, index=False,encoding='gbk')def _QhinitJobPoolCsv(self):# 初始化定时任务数据库文件夹# 作者:阙辉QhCheduPathpd = "{}\QhJobPoolDb".format(self.QhCheduPath)if os.path.exists(QhCheduPathpd):print("{} is exist!".format(QhCheduPathpd))else:os.mkdir(QhCheduPathpd)print("{} is not exist, create it!".format(QhCheduPathpd))self.QhCheduPoolJobCsv = "{}\QhJobPoolCsv.csv".format(QhCheduPathpd)if not os.path.exists(self.QhCheduPoolJobCsv):QhFiled = list(QhApscheduler.QhFiled.keys())self.QhCheduPoolJobDf = pd.DataFrame(columns=QhFiled)self.QhCheduPoolJobDf.to_csv(self.QhCheduPoolJobCsv, index=False)else:self.QhCheduPoolJobDf = pd.read_csv(self.QhCheduPoolJobCsv, encoding='gbk')self.QhCheduPoolJobDf.fillna("None", inplace=True)return self.QhCheduPoolJobDfdef QhAddJob(self, QhJabId,QhTimesType,    # 重复 间隔 一次QhJabFuncName,QhJabArgs=None,QhJabKwargs=None,QhName=None,QhYear = None,QhMonth = None,QhDay = None,QhWeek = None,QhDayOfWeek = None,QhHour = None,QhMinute = None,QhSecond = None,QhStartDate = None,QhEndDate = None,QhTimezone=None,QhJitter=None,misfire_grace_time=undefined,next_run_time=undefined,jobstore='default',executor='default',coalesce=undefined,max_instances=undefined,replace_existing=False,QhIsFor = False,QhJabStatus = None,QhJobIsOpen = False,):if self.Qhscheduler.get_job(QhJabId): print("{} is exist!".format(QhJabId))return   # 如果任务已经存在,则不添加if QhJabStatus == "已关闭" and (not QhJobIsOpen):print("{} 任务已关闭,不用新建!".format(QhJabId))returnQhTiggers = self.QhTiggers(QhTimesType =QhTimesType,QhYear = QhYear,QhMonth = QhMonth,QhDay = QhDay,QhWeek = QhWeek,QhDayOfWeek = QhDayOfWeek,QhHour = QhHour,QhMinute = QhMinute,QhSecond = QhSecond,QhStartDate = QhStartDate,QhEndDate = QhEndDate,QhTimezone=QhTimezone,QhJitter=QhJitter)if QhJabArgs!=None:QhJabArgs = tuple(QhJabArgs.split("+"))if QhJabKwargs != None:QhJabKwargs = QhJabKwargs.replace("+",',')QhJabKwargs = QhJabKwargs.replace("'",'"')QhJabKwargs = json.loads(QhJabKwargs)self.Qhscheduler.add_job(func=globals()[QhJabFuncName],trigger=QhTiggers,args=QhJabArgs,kwargs=QhJabKwargs,id=QhJabId,name=QhName,misfire_grace_time=misfire_grace_time,next_run_time=next_run_time,jobstore=jobstore,executor=executor,coalesce=coalesce,max_instances=max_instances,replace_existing=replace_existing,)# 函数参数还原输入格式处理  阙辉# print(QhJabArgs,type(QhJabArgs))if isinstance(QhJabArgs, tuple):QhJabArgs = str(QhJabArgs).replace("'",'').replace("(",'').\replace(")",'').replace(",","+").replace("+  ","+").replace("+ ","+")#     print(QhJabArgs,type(QhJabArgs))# print(QhJabKwargs,type(QhJabKwargs))if isinstance(QhJabKwargs, dict):QhJabKwargs = str(QhJabKwargs).replace("'",'"').replace(",","+")# print(QhJabKwargs,type(QhJabKwargs))QhAddJoblDic = copy.deepcopy(QhApscheduler.QhFiled) QhAddJoblDic["QhJabId"] = QhJabIdQhAddJoblDic["QhJabName"] = QhNameQhAddJoblDic["QhJabFuncName"] = "None" if QhJabFuncName==None else QhJabFuncNameQhAddJoblDic["QhTimesType"] = QhTimesTypeQhAddJoblDic["QhYear"] = "None" if QhYear==None else QhYearQhAddJoblDic["QhMonth"] = "None" if QhMonth==None else QhMonthQhAddJoblDic["QhDay"] = "None" if QhDay==None else QhDayQhAddJoblDic["QhWeek"] = "None" if QhWeek==None else QhWeekQhAddJoblDic["QhDayOfWeek"] = "None" if QhDayOfWeek==None else QhDayOfWeekQhAddJoblDic["QhHour"] = "None" if QhHour==None else QhHourQhAddJoblDic["QhMinute"] = "None" if QhMinute==None else QhMinuteQhAddJoblDic["QhSecond"] = "None" if QhSecond==None else QhSecondQhAddJoblDic["QhJabArgs"] = "None" if QhJabArgs==None else QhJabArgsQhAddJoblDic["QhJabKwargs"] = "None" if QhJabKwargs==None else QhJabKwargs# QhAddJoblDic["QhJabStartDate"] = "None"# QhAddJoblDic["QhJabNextRunTime"] = "None"# QhAddJoblDic["QhJabLastRunTime"] = "None"QhAddJoblDic["QhJabStatus"] = "已运行"try:   # 任务id存在,则更新任务,不存在则新增self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf["QhJabId"]==QhJabId].index[0]for QhKey,QhValue in QhAddJoblDic.items():if QhKey == "QhJabId":continue   self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf["QhJabId"]==QhJabId,QhKey] = QhValueexcept:QhCheduPoolJobDfRow = pd.DataFrame([QhAddJoblDic])print(QhCheduPoolJobDfRow)try:self.QhCheduPoolJobDf = self.QhCheduPoolJobDf._append(QhCheduPoolJobDfRow)except:self.QhCheduPoolJobDf = self.QhCheduPoolJobDf.append(QhCheduPoolJobDfRow)print(self.QhCheduPoolJobDf)# QhIsFor当为False时,保存到csv文件,单个增加时的场景if (not QhIsFor):self.QhCheduPoolJobDf.to_csv(self.QhCheduPoolJobCsv, index=False,encoding='gbk')def QhTiggers(self,QhTimesType,QhYear = None,QhMonth = None,QhDay = None,QhWeek = None,QhDayOfWeek = None,QhHour = None,QhMinute = None,QhSecond = None,QhStartDate = None,QhEndDate = None,QhTimezone=None,QhJitter=None):if QhTimesType == "重复":QhTiggers = CronTrigger(year=QhYear,month=QhMonth,day=QhDay,week=QhWeek,day_of_week=QhDayOfWeek,hour=QhHour,minute=QhMinute,second=QhSecond,start_date=QhStartDate,end_date=QhEndDate,timezone=QhTimezone,jitter=QhJitter)elif QhTimesType == "间隔":QhTiggers = IntervalTrigger(weeks= int(0) if QhWeek == None else QhWeek,days= 0 if QhDay == None else QhDay,hours= 0 if QhHour == None else QhHour,minutes= 0 if QhMinute == None else QhMinute,seconds= 0 if QhSecond == None else QhSecond,start_date=QhStartDate,end_date=QhEndDate,timezone=QhTimezone,jitter=QhJitter)elif QhTimesType == "一次":QhRunDate = datetime(0 if QhYear == None else QhYear, 0 if QhMonth == None else QhMonth, 0 if QhDay == None else QhDay, 0 if QhHour == None else QhHour, 0 if QhMinute == None else QhMinute, 0 if QhSecond == None else QhSecond)QhTiggers = DateTrigger(run_date=QhRunDate,timezone=QhTimezone)return QhTiggersdef QhPauseJob(self,QhJabId,QhIsFor=False):# 暂停任务 # QhIsFor当为False时,保存到csv文件,单个增加时的场景# 阙辉try:if QhJabId == "":print("任务ID不能空,请输入任务ID")returnif self.Qhscheduler.get_job(QhJabId):self.Qhscheduler.pause_job(QhJabId)print("暂停任务",QhJabId)self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabStatus'] = '已暂停'if (not QhIsFor):self.QhCheduPoolJobDf.to_csv(self.QhCheduPoolJobCsv, index=False, encoding='gbk')# AA = self.Qhscheduler.get_job(QhJabId)# print(AA.state)else:print("暂停失败,请检查任务ID,任务可能不存在")except:print("暂停失败,请检查任务ID,任务可能不存在")def QhPauseJobFor(self,QhIsFor=True):# 暂停所有任务for QhInx,QhRow in self.QhCheduPoolJobDf.iterrows():self.QhPauseJob(QhRow['QhJabId'],QhIsFor)def QhGetJobsState(self):for job in self.Qhscheduler.get_jobs():print(f"Job ID: {job.id}, 任务的下一次运行时间: {job.next_run_time}")print(f"Job ID: {job.id}, 任务是否有待执行: {job.pending}")# print(f"Job ID: {job.id}, 任务是否有待执行: {job.job_state}")# print(f"Job ID: {job.id}, 任务是否正在运行: {job.running}")def QhResumeJob(self,QhJabId,QhIsFor=False):# 恢复任务# QhIsFor当为False时,保存到csv文件,单个增加时的场景# 阙辉try:if QhJabId == "":print("任务ID不能空,请输入任务ID")returnif self.Qhscheduler.get_job(QhJabId):self.Qhscheduler.resume_job(QhJabId)print("恢复任务",QhJabId)self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabStatus'] = '已运行'if (not QhIsFor):self.QhCheduPoolJobDf.to_csv(self.QhCheduPoolJobCsv, index=False, encoding='gbk')else:print("恢复失败,请检查任务ID,任务可能不存在")except:print("恢复失败,请检查任务ID,任务可能不存在")def QhResumeJobFor(self,QhIsFor=True):# 恢复所有任务# QhIsFor当为False时,保存到csv文件,单个增加时的场景# 阙辉for QhInx,QhRow in self.QhCheduPoolJobDf.iterrows():self.QhResumeJob(QhRow['QhJabId'],QhIsFor)def QhRemoveJob(self,QhJabId,QhIsFor=False):# 删除任务# QhIsFor当为False时,保存到csv文件,单个增加时的场景# 阙辉try:if QhJabId == "":print("任务ID不能空,请输入任务ID")returnif self.Qhscheduler.get_job(QhJabId):self.Qhscheduler.remove_job(QhJabId)print("删除任务",QhJabId)self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabStatus'] = '已关闭'if (not QhIsFor):self.QhCheduPoolJobDf.to_csv(self.QhCheduPoolJobCsv, index=False, encoding='gbk')else:print("删除失败,请检查任务ID,任务可能不存在")except:print("删除失败,请检查任务ID,任务可能不存在")def QhRemoveJobFor(self,QhIsFor=True):# 删除所有任务# QhIsFor当为False时,保存到csv文件,单个增加时的场景# 阙辉for QhInx,QhRow in self.QhCheduPoolJobDf.iterrows():self.QhRemoveJob(QhRow['QhJabId'],QhIsFor)def QhReopenJob(self,QhJabId,QhIsFor=False):# 重新打开任务# QhIsFor当为False时,保存到csv文件,单个增加时的场景# 阙辉# try:if QhJabId == "":print("任务ID不能空,请输入任务ID")returnQhJabStatus = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabStatus'].values[0])if not self.Qhscheduler.get_job(QhJabId):if QhJabStatus == "已关闭":# QhJabId = QhRow["QhJabId"]QhJabName = self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabName'].values[0]QhJabFuncName = self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabFuncName'].values[0]QhTimesType = self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhTimesType'].values[0]QhYear = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhYear'].values[0])QhMonth = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhMonth'].values[0])QhDay = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhDay'].values[0])QhWeek = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhWeek'].values[0])QhDayOfWeek = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhDayOfWeek'].values[0])QhHour = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhHour'].values[0])QhMinute = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhMinute'].values[0])QhSecond = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhSecond'].values[0])QhJabArgs = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabArgs'].values[0])QhJabKwargs = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabKwargs'].values[0])       QhJabStartDate = self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabStartDate'].values[0]QhJabNextRunTime = self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabNextRunTime'].values[0]# QhJabLastRunTime = QhRow["QhJabLastRunTime"]# QhJabEndDate = QhRow["QhJabEndDate"]# QhJabStatus = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabStatus'].values[0])print(QhYear,QhMonth,QhDay,QhWeek,QhDayOfWeek,QhHour,QhMinute,QhSecond)print(type(QhYear),type(QhMonth),type(QhDay),type(QhWeek),type(QhDayOfWeek),type(QhHour),type(QhMinute),type(QhSecond))self.QhAddJob(QhJabId,QhTimesType=QhTimesType,QhJabFuncName = QhJabFuncName,QhJabArgs=QhJabArgs,QhJabKwargs=QhJabKwargs,QhName = QhJabName,QhYear = QhYear,QhMonth = QhMonth,QhDay = QhDay,QhWeek = QhWeek,QhDayOfWeek = QhDayOfWeek,QhHour = QhHour,QhMinute = QhMinute,QhSecond = QhSecond,QhJabStatus=QhJabStatus,QhIsFor = QhIsFor,QhJobIsOpen = True)  # 状态已在此函数更新# except:#     print("打开任务失败,请检查任务ID,任务可能不存在")def QhReopenJobFor(self,QhIsFor=True):# 重新打开所有任务# QhIsFor当为False时,保存到csv文件,单个增加时的场景# 阙辉for QhInx,QhRow in self.QhCheduPoolJobDf.iterrows():self.QhReopenJob(QhRow['QhJabId'],QhIsFor)def QhShouDongRunJob(self,QhJabId):# 手动运行任务# 阙辉try:if QhJabId == "":print("任务ID不能空,请输入任务ID")return# if self.Qhscheduler.get_job(QhJabId):QhJabFuncName = self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabFuncName'].values[0]QhJabArgs = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabArgs'].values[0])QhJabKwargs = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabKwargs'].values[0])QhJabFunc = globals().get(QhJabFuncName)if QhJabFunc:if QhJabArgs!= None:QhJabArgs = tuple(QhJabArgs.split("+"))QhJabFunc(*QhJabArgs)elif QhJabKwargs != None:QhJabKwargs = QhJabKwargs.replace("+",',')QhJabKwargs = QhJabKwargs.replace("'",'"')QhJabKwargs = json.loads(QhJabKwargs)QhJabFunc(**QhJabKwargs)else:print(f"Function '{QhJabFuncName}' not found.")# self.Qhscheduler.run_job(QhJabId)print("手动执行任务",QhJabId)except Exception as e:print(f"An error occurred while executing the job: {e}")print("2手动执行任务失败,请检查任务ID,任务可能不存在")def QhShouDongRunJobFor(self):# 手动运行所有任务# 阙辉for QhInx,QhRow in self.QhCheduPoolJobDf.iterrows():self.QhShouDongRunJob(QhRow['QhJabId'])def QhXiuGaiJob(self,QhJabId,QhIsFor=True):# 修改任务方案:先删除,修改后重新添加pass# self.QhCheduPoolJobDf = self._QhinitJobPoolCsv()  # 重新加载任务池数据# QhJabName = self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabName'].values[0]# QhJabFuncName = self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabFuncName'].values[0]# QhTimesType = self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhTimesType'].values[0]# QhYear = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhYear'].values[0])# QhMonth = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhMonth'].values[0])# QhDay = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhDay'].values[0])# QhWeek = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhWeek'].values[0])# QhDayOfWeek = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhDayOfWeek'].values[0])# QhHour = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhHour'].values[0])# QhMinute = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhMinute'].values[0])# QhSecond = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhSecond'].values[0])# QhJabArgs = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabArgs'].values[0])# QhJabKwargs = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabKwargs'].values[0])       # QhJabStartDate = self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabStartDate'].values[0]# QhJabNextRunTime = self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabNextRunTime'].values[0]# # QhJabLastRunTime = QhRow["QhJabLastRunTime"]# # QhJabEndDate = QhRow["QhJabEndDate"]# # QhJabStatus = self.QhGeShiZH(self.QhCheduPoolJobDf.loc[self.QhCheduPoolJobDf['QhJabId'] == QhJabId, 'QhJabStatus'].values[0])# print(QhYear,QhMonth,QhDay,QhWeek,QhDayOfWeek,QhHour,QhMinute,QhSecond)# print(type(QhYear),type(QhMonth),type(QhDay),type(QhWeek),type(QhDayOfWeek),type(QhHour),type(QhMinute),type(QhSecond))# self.Qhscheduler.modify_job()def QhGeShiZH(self,QhValue):# 时间格式转化  后期需要优化# 作者:阙辉try:if isinstance(QhValue, str):if QhValue in ["None","","0"]:# print("zhuan01")return Noneelse:try:# print("zhuan02")return int(QhValue)except:# print("zhuan03")return QhValueelse:# print("zhuan04")return int(QhValue)except:# print("zhuan05")return Noneclass QhTestApschedulerGui(QtWidgets.QWidget,Ui_Form):def __init__(self, parent=None):super(QhTestApschedulerGui, self).__init__(parent)self.setupUi(self)self.aa=QhApscheduler()self.pushButton_2.clicked.connect(self.QhPauseJob)self.pushButton_18.clicked.connect(self.QhResumeJob)self.pushButton_19.clicked.connect(self.aa.QhGetJobsState)self.pushButton.clicked.connect(self.QhAddJob)self.pushButton_3.clicked.connect(self.QhRemoveJob)self.pushButton_20.clicked.connect(self.aa.QhPauseJobFor)self.pushButton_21.clicked.connect(self.aa.QhResumeJobFor)self.pushButton_22.clicked.connect(self.aa.QhRemoveJobFor)self.pushButton_23.clicked.connect(self.aa.QhReopenJobFor)self.pushButton_6.clicked.connect(self.QhReopenJob)self.pushButton_4.clicked.connect(self.QhShouDongRunJob)self.pushButton_24.clicked.connect(self.aa.QhShouDongRunJobFor)def QhAddJob(self):QhJobId = self.lineEdit_5.text()if QhJobId == "":print("任务ID不能空,请输入任务ID")returnQhJobName = "{}-Name".format(QhJobId)QhScoends = random.randint(8, 20)QhTimesType = "间隔"QhJabFuncName = "QhRR"self.aa.QhAddJob(QhJobId,QhTimesType=QhTimesType,QhJabFuncName = QhJabFuncName,QhName = QhJobName,QhSecond = QhScoends,QhJabArgs = "{QhJobId}-测试顺序+QUEHUI".format(QhJobId=QhJobId),)print("添加任务{}".format(QhJobId))def QhPauseJob(self):QhJobId = self.lineEdit.text()print(QhJobId)self.aa.QhPauseJob(QhJobId)def QhResumeJob(self):QhJobId = self.lineEdit_18.text()print(QhJobId)self.aa.QhResumeJob(QhJobId)def QhRemoveJob(self):QhJobId = self.lineEdit_2.text()print(QhJobId)self.aa.QhRemoveJob(QhJobId)def QhReopenJob(self):QhJobId = self.lineEdit_6.text()print(QhJobId)self.aa.QhReopenJob(QhJobId)def QhShouDongRunJob(self):QhJobId = self.lineEdit_3.text()print(QhJobId)self.aa.QhShouDongRunJob(QhJobId)if __name__ == '__main__':# aa=QhApscheduler()# aa._QhInitAddJobFor() # # 保持主线程运行# try:#     while True:#         time.sleep(2)# except (KeyboardInterrupt, SystemExit):#     aa.Qhscheduler.shutdown()QApplication.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)qh_app = QApplication(sys.argv)                 # 创建应用实例qh_MyWindows = QhTestApschedulerGui()                        # 创建窗口实例qh_MyWindows.show()                             # 显示窗口qh_n = qh_app.exec()              # 执行exec()方法,进入事件循环,如果遇到窗口退出命令,返回整数qh_nprint(qh_n)                       # 输出输出关闭事件返回的整数try:                              # 捕获程序退出事件sys.exit(qh_n)                    # 通知python系统,结束程序运行except SystemExit:print("请在此做一些其他工作。")       # python解释器停止执行前的工作

UI代码

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'QhTestJob.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(632, 610)self.gridLayout = QtWidgets.QGridLayout(Form)self.gridLayout.setObjectName("gridLayout")self.verticalLayout = QtWidgets.QVBoxLayout()self.verticalLayout.setObjectName("verticalLayout")self.horizontalLayout_5 = QtWidgets.QHBoxLayout()self.horizontalLayout_5.setObjectName("horizontalLayout_5")self.pushButton = QtWidgets.QPushButton(Form)self.pushButton.setObjectName("pushButton")self.horizontalLayout_5.addWidget(self.pushButton)self.lineEdit_5 = QtWidgets.QLineEdit(Form)self.lineEdit_5.setMinimumSize(QtCore.QSize(500, 28))self.lineEdit_5.setMaximumSize(QtCore.QSize(500, 16777215))self.lineEdit_5.setObjectName("lineEdit_5")self.horizontalLayout_5.addWidget(self.lineEdit_5)self.verticalLayout.addLayout(self.horizontalLayout_5)self.horizontalLayout_4 = QtWidgets.QHBoxLayout()self.horizontalLayout_4.setObjectName("horizontalLayout_4")self.pushButton_2 = QtWidgets.QPushButton(Form)self.pushButton_2.setObjectName("pushButton_2")self.horizontalLayout_4.addWidget(self.pushButton_2)self.lineEdit = QtWidgets.QLineEdit(Form)self.lineEdit.setMinimumSize(QtCore.QSize(230, 28))self.lineEdit.setMaximumSize(QtCore.QSize(500, 16777215))self.lineEdit.setObjectName("lineEdit")self.horizontalLayout_4.addWidget(self.lineEdit)self.verticalLayout.addLayout(self.horizontalLayout_4)self.horizontalLayout_18 = QtWidgets.QHBoxLayout()self.horizontalLayout_18.setObjectName("horizontalLayout_18")self.pushButton_18 = QtWidgets.QPushButton(Form)self.pushButton_18.setObjectName("pushButton_18")self.horizontalLayout_18.addWidget(self.pushButton_18)self.lineEdit_18 = QtWidgets.QLineEdit(Form)self.lineEdit_18.setMinimumSize(QtCore.QSize(230, 28))self.lineEdit_18.setMaximumSize(QtCore.QSize(500, 16777215))self.lineEdit_18.setObjectName("lineEdit_18")self.horizontalLayout_18.addWidget(self.lineEdit_18)self.verticalLayout.addLayout(self.horizontalLayout_18)self.horizontalLayout_3 = QtWidgets.QHBoxLayout()self.horizontalLayout_3.setObjectName("horizontalLayout_3")self.pushButton_3 = QtWidgets.QPushButton(Form)self.pushButton_3.setObjectName("pushButton_3")self.horizontalLayout_3.addWidget(self.pushButton_3)self.lineEdit_2 = QtWidgets.QLineEdit(Form)self.lineEdit_2.setMinimumSize(QtCore.QSize(230, 28))self.lineEdit_2.setMaximumSize(QtCore.QSize(500, 16777215))self.lineEdit_2.setObjectName("lineEdit_2")self.horizontalLayout_3.addWidget(self.lineEdit_2)self.verticalLayout.addLayout(self.horizontalLayout_3)self.horizontalLayout_6 = QtWidgets.QHBoxLayout()self.horizontalLayout_6.setObjectName("horizontalLayout_6")self.pushButton_6 = QtWidgets.QPushButton(Form)self.pushButton_6.setObjectName("pushButton_6")self.horizontalLayout_6.addWidget(self.pushButton_6)self.lineEdit_6 = QtWidgets.QLineEdit(Form)self.lineEdit_6.setMinimumSize(QtCore.QSize(230, 28))self.lineEdit_6.setMaximumSize(QtCore.QSize(500, 16777215))self.lineEdit_6.setObjectName("lineEdit_6")self.horizontalLayout_6.addWidget(self.lineEdit_6)self.verticalLayout.addLayout(self.horizontalLayout_6)self.horizontalLayout_2 = QtWidgets.QHBoxLayout()self.horizontalLayout_2.setObjectName("horizontalLayout_2")self.pushButton_4 = QtWidgets.QPushButton(Form)self.pushButton_4.setObjectName("pushButton_4")self.horizontalLayout_2.addWidget(self.pushButton_4)self.lineEdit_3 = QtWidgets.QLineEdit(Form)self.lineEdit_3.setMinimumSize(QtCore.QSize(230, 28))self.lineEdit_3.setMaximumSize(QtCore.QSize(500, 16777215))self.lineEdit_3.setObjectName("lineEdit_3")self.horizontalLayout_2.addWidget(self.lineEdit_3)self.verticalLayout.addLayout(self.horizontalLayout_2)self.horizontalLayout = QtWidgets.QHBoxLayout()self.horizontalLayout.setObjectName("horizontalLayout")self.pushButton_5 = QtWidgets.QPushButton(Form)self.pushButton_5.setObjectName("pushButton_5")self.horizontalLayout.addWidget(self.pushButton_5)self.lineEdit_4 = QtWidgets.QLineEdit(Form)self.lineEdit_4.setMinimumSize(QtCore.QSize(230, 28))self.lineEdit_4.setMaximumSize(QtCore.QSize(500, 16777215))self.lineEdit_4.setObjectName("lineEdit_4")self.horizontalLayout.addWidget(self.lineEdit_4)self.verticalLayout.addLayout(self.horizontalLayout)self.pushButton_19 = QtWidgets.QPushButton(Form)self.pushButton_19.setObjectName("pushButton_19")self.verticalLayout.addWidget(self.pushButton_19)self.pushButton_24 = QtWidgets.QPushButton(Form)self.pushButton_24.setObjectName("pushButton_24")self.verticalLayout.addWidget(self.pushButton_24)self.pushButton_20 = QtWidgets.QPushButton(Form)self.pushButton_20.setObjectName("pushButton_20")self.verticalLayout.addWidget(self.pushButton_20)self.pushButton_21 = QtWidgets.QPushButton(Form)self.pushButton_21.setObjectName("pushButton_21")self.verticalLayout.addWidget(self.pushButton_21)self.pushButton_22 = QtWidgets.QPushButton(Form)self.pushButton_22.setObjectName("pushButton_22")self.verticalLayout.addWidget(self.pushButton_22)self.pushButton_23 = QtWidgets.QPushButton(Form)self.pushButton_23.setObjectName("pushButton_23")self.verticalLayout.addWidget(self.pushButton_23)self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.pushButton.setText(_translate("Form", "添加任务"))self.pushButton_2.setText(_translate("Form", "暂停任务"))self.pushButton_18.setText(_translate("Form", "启动任务"))self.pushButton_3.setText(_translate("Form", "删除任务"))self.pushButton_6.setText(_translate("Form", "打开任务"))self.pushButton_4.setText(_translate("Form", "手动执行"))self.pushButton_5.setText(_translate("Form", "获取任务状态"))self.pushButton_19.setText(_translate("Form", "获取所有任务的状态"))self.pushButton_24.setText(_translate("Form", "手动执行所有任务"))self.pushButton_20.setText(_translate("Form", "暂停所有任务"))self.pushButton_21.setText(_translate("Form", "恢复所有任务"))self.pushButton_22.setText(_translate("Form", "关闭所有任务"))self.pushButton_23.setText(_translate("Form", "打开所有任务"))

 

 

相关文章:

python 定时任务管理封装

主逻辑代码 # -*- coding: utf-8 -*- # import apscheduler import pandas as pd from datetime import datetime # 导入调度器,此处使用BackgroundScheduler阻塞调度器 from apscheduler.schedulers.background import BackgroundScheduler # 导入触发器&#xf…...

GIS数据处理/程序/指导,街景百度热力图POI路网建筑物AOI等

简介其他数据处理/程序/指导!!!(1)街景数据获取(2)街景语义分割后像素提取,指标计算代码(绿视率,天空开阔度、视觉熵/景观多样性等)(3…...

【落羽的落羽 C语言篇】自定义类型——结构体

文章目录 一、结构体1. 结构体类型的概念和声明2. 结构体变量的创建和初始化3. 结构体成员的访问3.1 直接访问3.2 间接访问 4. 结构体的内存对齐4.1 内存对齐的规则4.2 内存对齐的原因4.3 修改默认对齐数 5. 结构体传参6. 结构体实现位段 在C语言中,已经提供了一些基…...

【WPS安装】WPS编译错误总结:WPS编译失败+仅编译成功ungrib等

WPS编译错误总结:WPS编译失败仅编译成功ungrib等 WPS编译过程问题1:WPS编译失败错误1:gfortran: error: unrecognized command-line option ‘-convert’; did you mean ‘-fconvert’?解决方案 问题2:WPS编译三个exe文件只出现u…...

【Python入门】文件读写

文章一览 一、什么是文件二、文件形态三、文件组成要素四、文件操作五、文件路径六、文件读写操作6.1 文件打开模式6.2 文件的打开6.3 正确关闭文件6.3.1 读文件方法6.3.2 写文件 七、CSV 文件读取7.1 CSV 数据存储格式7.2 CSV 文件特点7.3 使用记事本创建 CSV 文件7.4 用 csv …...

基于变异策略的模糊测试:seed与mutation的含义

1. 引入 最早期的模糊测试(fuzz),是生成一些随机的文本序列,对unix系统的命令行输入进行测试。这种古老的方式,也发现了不少漏洞。 但完全随机的fuzz,存在如下问题: (1&#xff09…...

制造研发企业与IPD管理体系

芯片/半导体/制造研发型企业,大都知道华为使用过的IPD管理体系,但大家用到什么程度,那就是参差不齐了。 因为IPD管理体系它只是一个管理理念,是一个方法论。它需要有相应的组织架构来承载,它有很复杂的流程需要有IT系统…...

电子应用设计方案68:智能晾衣架系统设计

智能晾衣架系统设计 一、引言 智能晾衣架作为智能家居的一部分,为用户提供了更便捷、高效和舒适的衣物晾晒体验。本设计方案旨在打造一款功能丰富、性能稳定且易于操作的智能晾衣架系统。 二、系统概述 1. 系统目标 - 实现晾衣架的自动升降,方便衣物的…...

如何实现圆形头像功能

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了Stack Widget,本章回中将介绍CircleAvatar这种Widget,闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 在上一回中我们使用了CircleAvatar Widget,之前也没有介绍过此Widget,因此有些看官希望对它做一些介绍…...

【python自动化六】UI自动化基础-selenium的使用

selenium是目前用得比较多的UI自动化测试框架,支持java,python等多种语言,目前我们就选用selenium来做UI自动化。 1.selenium安装 安装命令 pip install selenium2.selenium的简单使用 本文以chrome浏览器为例,配套selenium中c…...

时间复杂度和空间复杂度理解

空间复杂度和时间复杂度是算法分析中两个重要的概念,用于评估算法的性能。在前端 JavaScript 中,时间复杂度用于评估算法在最坏情况下的运行时间;空间复杂度描述了算法在执行过程中所需的内存空间的增长率,它包括算法所需的临时空…...

详细解读sedex验厂

SEDEX验厂,即供货商商业道德信息交流认证(Supplier Ethical Data Exchange),是一种表明企业遵守商业道德的认证。以下是对SEDEX验厂的详细解读: 一、SEDEX验厂概述 SEDEX是一家总部位于英国伦敦的非营利组织&#xf…...

IOT、MES、WMS、MOM 和 EPMS 系统综合技术与业务文档

IOT、MES、WMS、MOM 和 EPMS 系统综合技术与业务文档 一、引言 在现代制造业和工业管理领域,IOT(物联网)、MES(制造执行系统)、WMS(仓库管理系统)、MOM(制造运营管理系统&#xff…...

ESP32S3 使用LVGL驱动LCD屏(ST7789主控)

ESP32S3 使用LVGL驱动LCD屏(ST7789主控) 目录 1 分析原理图 2 驱动、点亮LCD(ST7789) 2.1 在工程中添加目录、文件 2.2 添加esp_lvgl_port组件 2.3 对工程进行必要的配置 2.4 编写必要代码 3 烧录、验证 1 分析原理图 要使用SOC驱动LCD屏&#…...

Zed调试宏 C语言错误日志 异常错误调试信息

1、C中的错误码 在C语言中通过返回错误码或设置全局的errno值来反馈错误问题。errno.h是一个头文件,它定义了一个全局变量errno,用于在程序中记录和报告错误的原因。这个机制主要用于处理系统调用或标准库函数出错时的错误反馈。当系统调用或库函数…...

GitCode 光引计划征文|JavaVision:引领全能视觉智能识别新纪元

在人工智能技术飞速发展的今天,计算机视觉作为AI领域的重要分支,正逐渐渗透到各行各业中。JavaVision,作为[光引计划]的一部分,致力于提供一个基于Java的全能视觉智能识别解决方案。同时它集成了MilvusPlus,旨在提供一…...

数据分析思维(五):分析方法——假设检验分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python,更重要的是数据分析思维。没有数据分析思维和业务知识,就算拿到一堆数据,也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》,本文内容就是提取…...

《OpenCV计算机视觉》--介绍及基础操作

文章目录 《OpenCV计算机视觉》--介绍及基础操作一.OpenCV介绍二.下载OpenCV三.基础操作1.调用OpenCV2.读取图片信息3.读取图片的灰度图4.视频文件读取5.对图片进行切片6.提取RGB颜色通道7.合并颜色通道8.图片修改图片打码图片组合 9.cv2.resize10.图形运算图像加法运算cv2.add…...

利用Java爬虫获取苏宁易购商品详情

在数字化时代,电商平台的商品信息对于市场分析、价格监控和消费者决策至关重要。苏宁易购作为中国领先的电商平台之一,提供了丰富的商品信息。本文将介绍如何使用Java语言开发爬虫,获取苏宁易购商品的详细信息。 Java爬虫技术简介 Java作为一…...

【CVE-2024-53375】TP-Link Archer系列路由器认证操作系统命令注入(内附远离和代码利用)

CVE-2024-53375 TP-Link Archer系列路由器认证操作系统命令注入 受影响的设备 使用 HomeShield 功能的 TP-Link 设备容易受到此漏洞的影响。这包括 TP-Link Archer 系列的多款路由器。 经过测试 Archer AXE75(EU)_V1_1.2.2 Build 20240827(发布日期 2024 年 11 月 4 日)…...

DP动态规划(装箱问题)

# [NOIP2001 普及组] 装箱问题 ## 题目描述 有一个箱子容量为 $V$,同时有 $n$ 个物品,每个物品有一个体积。 现在从 $n$ 个物品中,任取若干个装入箱内(也可以不取),使箱子的剩余空间最小。输出这个最小值。…...

selenium学习笔记(一)

文章目录 前言一、selenium的简介java使用seleniumPython使用selenium常用的浏览器selenium的功能 二、chromeDriver的安装查看本机的chrome版本?匹配对应的chromedriver并下载在服务器上例如Centos如何安装Chrome 三、selenium内容详解chrome启动chrome启动参数元素…...

jest expect().resolves和expect().rejects原理

假设存在如下代码 export default function fetchData(fn) {return Axios.get(http://www.dell-lee.com/react/api/demo.json) } 接口返回的数据为 {"success": true } 那么对于测试代码 test(fetchData, async () > {await expect(fetchData()).resolves.to…...

大语言模型驱动的Agent:定义、工作原理与应用

文章目录 引言什么是大语言模型? Agent的概念LLM Agent的工作原理 Dify平台上的AgentLLM Agent的应用场景挑战与展望结论 引言 随着人工智能(AI)技术的发展,特别是自然语言处理(NLP)领域的进步&#xff0c…...

写作词汇积累:纰漏、坎肩、颠三倒四、隔阂

纰漏 【纰漏】是指因粗心而产生的差错、小事故或漏洞 1. 在准备这次会议的过程中,我们反复核对资料,力求不出现任何【纰漏】。2. 在这次重要的项目汇报中,他小心翼翼地检查每一页 PPT,生怕出现任何【纰漏】。3. 尽管她工作一向细…...

一种简易的免杀绕过方法

一种简易的免杀绕过方法 这里我们直接参考师兄的项目https://github.com/snnxyss/In-Swor exe-shellcode-加密-运行 话不多说直接上图 这里我们用geacon作为本次实验 从这里我们可以看到 geacon已经不行了 这里我们将exe转shellcode 生成之后将123.txt放到config目录下 利…...

CTF web解题 [NISACTF 2022]popchains PHP反序列化 pop链

不积跬步无以至千里 不积小流无以成江海 对web方向有了更近一步的了解&#xff0c;根据一道题目来学习PHP反序列化及pop链 [NISACTF 2022]popchains flag&#xff1a;NSSCTF{3096663a-4b18-4567-bdfb-8403f9414704} Happy New Year~ MAKE A WISH <?php echo?Happy?Ne…...

重温设计模式--单例模式

文章目录 单例模式&#xff08;Singleton Pattern&#xff09;概述单例模式的实现方式及代码示例1. 饿汉式单例&#xff08;在程序启动时就创建实例&#xff09;2. 懒汉式单例&#xff08;在第一次使用时才创建实例&#xff09; 单例模式的注意事项应用场景 C代码懒汉模式-经典…...

AI的进阶之路:从机器学习到深度学习的演变(一)

AI的进阶之路&#xff1a;从机器学习到深度学习的演变 在当今科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;和深度学习&#xff08;DL&#xff09;已成为推动创新的核心力量。这三个领域虽然紧密相连&#xff0c;却…...

WPF+MVVM案例实战与特效(四十七)-实现一个路径绘图的自定义按钮控件

文章目录 1、案例效果2、创建自定义 PathButton 控件1、定义 PathButton 类2、设计样式与控件模板3、代码解释3、控件使用4、直接在 XAML 中绑定命令3、源代码获取4、总结1、案例效果 2、创建自定义 PathButton 控件 1、定义 PathButton 类 首先,我们需要创建一个新的类 Pat…...

Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印

图样&#xff1a; 就可以导入了 上代码 import tkinter as tk from tkinter import ttk import sqlite3 from datetime import datetime from tkinter import messagebox, filedialog import pandas as pd import reclass OrderSystem:def __init__(self, root):self.root r…...

【电商搜索】CRM: 具有可控条件的检索模型

【电商搜索】CRM: 具有可控条件的检索模型 目录 文章目录 【电商搜索】CRM: 具有可控条件的检索模型目录文章信息摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果&#xff08;包含重要数据与结论&#xff09;相关工作后续优化方向 后记 https://arxiv.org/pdf/2412.…...

python使用pip进行库的下载

前言 现如今有太多的python编译软件&#xff0c;其库的下载也是五花八门&#xff0c;但在作者看来&#xff0c;无论是哪种方法都是万变不离其宗&#xff0c;即pip下载。 pip是python的包管理工具&#xff0c;无论你是用的什么python软件&#xff0c;都可以用pip进行库的下载。 …...

Golang 的并发优势

在如今的编程领域&#xff0c;一个程序能够同时处理多个任务的能力非常重要&#xff0c;这就是所谓的并发处理。而 Golang 在并发编程方面表现十分出色&#xff0c;具有很多独特的优势&#xff0c;简直不要太简单。 一、轻量级的协程&#xff08;Goroutine&#xff09; 在传统…...

5G学习笔记之Non-Public Network

目录 0. NPN系列 1. 概述 2. SNPN 2.1 SNPN概述 2.2 SNPN架构 2.3 SNPN部署 2.3.1 完全独立 2.3.2 共享PLMN基站 2.3.3 共享PLMN基站和PLMN频谱 3. PNI-NPN 3.1 PNI-NPN概述 3.2 PNI-NPN部署 3.2.1 UPF独立 3.2.2 完全共享 0. NPN系列 1. NPN概述 2. NPN R18 3. 【SNPN系列】S…...

SpringBoot——核心概念

文章目录 一.核心概念IoC/DI思想2.Ioc容器3.Bean 二.IoC入门案例三.DI入门案例分析四.bean基础配置五.bean的实例化&#xff08;创建&#xff09;六.bean实例化——静态工厂七.bean实例化——示例工程与FactoryBean八.bean的生命周期九.依赖注入的两种方式十.构造器注入十一.依…...

【HarmonyOs学习日志(14)】计算机网络之域名系统DNS

域名系统DNS 域名系统DNS——从域名解析出IP地址 文章目录 域名系统DNS概述域名到IP地址的解析 互联网的域名结构命名标准 域名服务器域名的解析过程 概述 域名系统DNS&#xff08;Domain Name System&#xff09;是互联网使用的命名系统&#xff0c;用来把便于人们使用的机器…...

电脑丢失bcrypt.dll文件是什么原因?找不到bcrypt.dll文件修复办法来啦!

电脑运行时常见问题及解决方案&#xff1a;文件丢失、文件损坏与系统报错 作为一名软件开发从业者&#xff0c;深知电脑在日常使用中难免会遇到各种问题&#xff0c;如文件丢失、文件损坏和系统报错等。这些问题不仅影响工作效率&#xff0c;还可能带来数据丢失的风险。今天&a…...

shell编程3

声明 学习视频来自B站UP主 泷羽sec 向脚本程序传递参数 可以向脚本程序传递一个或多参数 echo 执行的文件名是:S0 echo 第一个参数是: 1 e c h o 传递的参数作为一个字符串显示 : 1 echo 传递的参数作为一个字符串显示: 1echo传递的参数作为一个字符串显示:* echo 传递的参数…...

LAUNCHXL_F28379D_Workspace_CCS124

/// 安装 controlSUITE C:\ti\controlSUITE\device_support\F2837xD\v210 /// /// /// /// /// 删除 /// /// /// >> Compilation failure source_common/subdir_rules.mk:9: recipe for target source_common/F2837xD_Adc.obj failed "C:/ti/controlSUITE/devic…...

智慧商城:编辑切换状态,删除功能

编辑切换状态 为 编辑 注册点击事件进行状态取反&#xff0c;为该状态赋一个初始值 false 如果是非编辑状态是要进行结算的&#xff0c;否则删除 点击“编辑”状态是 要进行 “删除”&#xff0c;非编辑状态是要进行 “结算” 当 结算 时&#xff0c;希望是能 全选 进而能多卖…...

支付测试 流程

支付测试 流程 支付测试是确保支付系统安全、稳定、可靠运行的关键环节&#xff0c;以下是其一般流程&#xff1a; 测试计划阶段 明确测试目标&#xff1a;确定本次支付测试的重点和预期达到的目标&#xff0c;如测试支付功能的完整性、安全性、性能等。制定测试计划&#x…...

Ai编程从零开始全栈开发一个后台管理系统之用户登录、权限控制、用户管理-前端部分(十二)

云风网 云风笔记 云风知识库 一、创建前端部分 1、vite初始化项目 npm create vitelatest admin-frontend – --template vue-ts 2、安装必要的依赖 npm install vue-router pinia axios element-plus element-plus/icons-vue安装完成后package.json如下&#xff1a; {&qu…...

LeetCode 197. 上升的温度

LeetCode 197. 上升的温度 表&#xff1a; Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是该表具有唯一值的列。 没有具有相同 recordDate 的不同行。…...

ECharts散点图-气泡图,附视频讲解与代码下载

引言&#xff1a; ECharts散点图是一种常见的数据可视化图表类型&#xff0c;它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图&#xff0c;包括图表效果预览、视频讲解及代码下载&#xff0c;让你轻松掌握…...

【pycharm】对需要传参数以及配置文件的情况进行debug教程

【pycharm】对需要传参数以及配置文件的情况进行debug教程 例如下面这个项目&#xff0c;我们要运行需要在终端输入 python main.py -mtrain -trsr0.03 -vsr0.01其中 -m‘train’ -trsr0.03 -vsr0.01是我们需要传的参数 在终端运行如下&#xff1a; 如果我们要进行debug的话…...

three.js混合白色模型的智慧城市扫光效果

three.js混合白色模型的智慧城市扫光效果 https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idcityBlendLight import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { FBXLoader …...

【QT常用技术讲解】发送POST包(两种方式:阻塞方式及非阻塞方式)

前言 http/https(应用层)协议是广泛使用的网络通信协议。在很多与第三方API对接的场景中&#xff0c;通常是通过http/https协议完成&#xff0c;比如API对接时&#xff0c;通常要通过POST包获取access_token进行鉴权&#xff0c;然后再进行数据交互&#xff08;本篇也包含有对接…...

基于Python大数据的电影可视化分析系统

标题:基于 Python 大数据的电影可视化分析系统 内容:1.摘要 本文介绍了一个基于 Python 大数据的电影可视化分析系统。该系统通过收集和分析大量电影数据&#xff0c;提供了对电影市场的深入洞察。文章首先介绍了系统的背景和目的&#xff0c;然后详细描述了系统的架构和功能。…...

Vue3:uv-upload图片上传

效果图&#xff1a; 参考文档&#xff1a; Upload 上传 | 我的资料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生态框架 (uvui.cn) 代码&#xff1a; <view class"greenBtn_zw2" click"handleAddGroup">添加班级群</vie…...