python学习记录一

一、目的

  由于项目发布点多,更新迭代耗时,想搞一个自动发布的任务,以前也没有用python写过,这个任务当做练手了。

二、步骤

1、安装python,pip。我安装的是python3.6,只要在安装过程中选择安装pip即可。

2、首先考虑的是弄一个定时钟跑,check_update检测更新,有更新则停止服务,备份war包,跑sql脚本,备份sql脚本。关键代码如下:

def process_update():
    try:
        result = check_update()
        print("check result: %s" %result)
        if( result== 1):
            now = datetime.datetime.now()
            year_month_day_hour_minute = str(now.year)+str(now.month)+str(now.day)+str(now.hour)+str(now.minute)
            service.stop_service(service_name)
            #备份war
            mymovefile(ftp.dest_dir+os.sep+ftp.dest_war_name, ftp.bak_dir+os.sep+year_month_day_hour_minute
                       + os.sep+ftp.dest_war_name)

            mymovefile(os.getcwd()+os.sep+ftp.file_name[0], ftp.dest_dir+os.sep+ftp.dest_war_name)
            #移动script
            script_files = []
            path = os.listdir(os.getcwd())
            for p in path:
                if os.path.isfile(p) and p.find('.sql') != -1:
                    script_files.append(p)
                    mymovefile(os.getcwd()+os.sep+p, ftp.script_dest_dir+os.sep+p)
            #移动script
            #
            while service.status_service(service_name) != service.STOPPED:
                time.sleep(3)
                print("服务关闭中....")
            #执行script
            sorted(script_files, key=lambda str: str[0:str.find('_')])
            for script_file in script_files:
                db.executeScript(ftp.script_dest_dir+os.sep+script_file)
            #执行script
            #备份scrpit
                mymovefile(ftp.script_dest_dir+os.sep+script_file, ftp.script_bak_dir+os.sep +
                           year_month_day_hour_minute+os.sep+script_file)
            #备份scrpit
            service.start_service(service_name)
            while service.status_service(service_name) != service.RUNNING:
                time.sleep(3)
                print("服务启动中....")
        else:
            print("服务无更新!")
    except Exception as e:
        print ('str(Exception):\t', str(Exception))
        print ('str(e):\t\t', str(e))
        print ('repr(e):\t', repr(e))
        print ('e.message:\t', e.message)
    finally:
        timer = threading.Timer(3.0, process_update)
        timer.start()

if __name__ == '__main__':
    print("任务开始")
    scheduler = BackgroundScheduler()

    try:
        timer = threading.Timer(3.0, process_update)
        timer.start()

        while True:
            time.sleep(3)
    except (KeyboardInterrupt, SystemExit):
        scheduler.shutdown()
        print('Exit The Job!')

3、下面就是实现check_update方法了,主要是到指定的ftp服务器中获取文件,与目的地文件进行比较,如果时间比本地文件新,则更新升级,关键代码如下:

def check_update():
    now = datetime.datetime.now()
    year_month_day_hour_minute = str(now.year)+str(now.month)+str(now.day)+str(now.hour)+str(now.minute)
    ftp = connect()                  #连接登陆ftp
    try:ftp.cwd(ftp_war_dir)
    except ftplib.error_perm:
        print('进入目录"%s" 失败' %ftp_war_dir)
    # print('当前目录"%s"' %ftp.pwd())
    del file_list[:]
    del filter_file_list[:]
    del file_name[:]
    ftp.retrlines('LIST',set_file_property)
    filter_file(file_list)
    if(filter_file_list.__len__() > 0):
        filename=filter_file_list[0]
        print("开始下载war包....")
        download(ftp,filename)  #下载war文件
        print("下载完毕")
        # war备份文件
        print("开始删除ftp上war包....")
        ftp.delete(filename) #为了测试暂时不备份
        print("删除完成")
        try:
            ftp.cwd(ftp_war_bak_dir+linux_sep+year_month_day_hour_minute)
        except:
            ftp.mkd(ftp_war_bak_dir+linux_sep+year_month_day_hour_minute)
        ftp.cwd(ftp_war_bak_dir+linux_sep+year_month_day_hour_minute)
        print("开始备份war包....")
        upload(ftp,os.getcwd()+os.sep+filename)
        print("备份完毕")
        # war备份文件
        try:ftp.cwd(ftp_script_dir)
        except ftplib.error_perm:
            print('进入目录"%s" 失败' %ftp_script_dir)
        del script_list[:]
        ftp.retrlines('LIST',get_script_file)
        for script in script_list:
            download(ftp,script)          #下载sql文件
        #检查ftp目录下是否已没有war,如果没有,则移动script
        del file_list[:]
        try:ftp.cwd(ftp_war_dir)
        except ftplib.error_perm:
            print('进入目录"%s" 失败' %ftp_war_dir)
        ftp.retrlines('LIST',set_file_property)
        if file_list.__len__() == 0:
            try:ftp.cwd(ftp_script_dir)
            except ftplib.error_perm:
                print('进入目录"%s" 失败' %ftp_script_dir)
            #备份ftp script
            for script in script_list:
                ftp.delete(script)
            try:
                ftp.cwd(ftp_script_bak_dir+linux_sep+year_month_day_hour_minute)
            except:
                ftp.mkd(ftp_script_bak_dir+linux_sep+year_month_day_hour_minute)
            ftp.cwd(ftp_script_bak_dir+linux_sep+year_month_day_hour_minute)
            for script in script_list:
                upload(ftp,os.getcwd()+os.sep+script)
        #检查ftp目录下是否已没有war,如果没有,则移动script
        file_name.append(filename)
        return 1
    else:
        return 0

4、最后还有两个功能需要实现,一个是sql脚本执行,service操作。代码如下:

import pymysql

db_host='127.0.0.1'
db_username='root'
db_password='root1234'
ok_db_name='defect'


def executeScript(file):

    try:
        conn = pymysql.connect(
            host = db_host,
            user = db_username,
            passwd = db_password,
            #db = "dome"
            )
        cur = conn.cursor() #获取mysql中所有数据库
        cur.execute('SHOW DATABASES')
        db_names = cur.fetchall()
        for db_name in db_names:
            if db_name[0].count(ok_db_name) != 0:
                use_db_name = db_name[0]
                break
    except:
        return
    conn.close()
    db = pymysql.connect(db_host, db_username, db_password, use_db_name, charset='utf8')

    # 使用cursor()方法获取操作游标
    cursor = db.cursor()

    sql = ''   #拼接的sql语句
    f=open(file, "r")
    for each_line in f.readlines():
        each_line=each_line.replace("\n","")
        # 过滤数据
        if not each_line or each_line == "\n":
            continue
        # 如果没有遇到结束符则继续
        elif each_line.find(";") == -1:
            sql += each_line
        # 否则就执行,执行后,清空sql
        else:
            sql += each_line
            cursor.execute(sql)
            sql=''
            db.commit()
    db.close()


def executeQuery (sql):
    try:
        conn = pymysql.connect(
            host = db_host,
            user = db_username,
            passwd = db_password,
            #db = "dome"
        )
        cur = conn.cursor() #获取mysql中所有数据库
        cur.execute('SHOW DATABASES')
        db_names = cur.fetchall()
        for db_name in db_names:
            if db_name[0].count(ok_db_name) != 0:
                use_db_name = db_name[0]
                break
    except:
        return
    conn.close()
    # 打开数据库连接
    db = pymysql.connect(db_host, db_username, db_password, use_db_name, charset='utf8')

    # 使用cursor()方法获取操作游标
    cursor = db.cursor()

    # 使用execute方法执行SQL语句
    cursor.execute(sql)

    # 使用 fetchone() 方法获取一条数据
    data = cursor.fetchall()

    # 关闭数据库连接
    db.close()
    return data

猜你喜欢

转载自blog.csdn.net/u010940131/article/details/84317680
今日推荐