• python实用脚本-通过jenkins界面化导出数据


    1、jenkins 配置

    2、jenkins 脚本

    ansible-playbook /opt/test.yaml --extra-vars "loanno=${loanno}" --extra-vars "type=${type}"

    中转机器脚本

    test.yaml
    ---
    - name: 开始导出合同
    hosts: test
    tasks:
    - name: 执行导出脚本
    shell: echo {{ loanno }}
    shell: echo {{ type }}
    shell: echo loanno
    shell: python /app/crontab/python/autocontract/contract_supplement.py {{ loanno }} {{ type }}
    register: result
    - name: 打印输出结果
    debug: msg="{{ result }}"

    3、远程机器下载脚本

    python /python/autocontract/contract_supplement.py {{ loanno }} {{ type }}

    4、python 脚本

    # coding:utf8
    import sys
    import xlwt
    import mysql.connector
    import datetime
    import send_mail
    import os
    import time
    import file_tar
    
    
    nowtime = datetime.datetime.now().strftime('%Y%m%d')
    oddir="/app/crontab/python"
    #filename = "%s/cma_registerinfo%s.xls"%(oddir,nowtime)
    file_count = 0
    end_date=time.strftime("%Y-%m-%d", time.localtime())
    
    tmp_dir='/app/crontab/python/autocontract'
    tmp_file_list='tmp.txt'
    sorce_dir='/data/nfs/yyapp/yylending/usercontract'
    ods_dir='/app/crontab/python/autocontract/tmp'
    filename=ods_dir+'/test.tar.gz'
    #var_loan=''
    #var_type=''
    
    #sql='select path  from  test   where  loadNo  in (%s) and  cid  in(%s);' %(var_loan,var_type)
    
    
    
    config = {
        'user': '******',
        'password': ''******',',
        'host': ''******',',
        'port': ''******',',
        'database': ''******',',
        'charset': 'utf8'
    }
    
    
    mail_list = {
        'sender':'xiajq@PH-LOTH-V159.localdomain', #发件人
        'receivers':'test@qq.com', #收件人
        'title':'*****', #邮件主题
        'content':'*****', #邮件内容
        'attfilename':'',#附件内容
        'server':'localhost' #发送邮件服务器。默认为本机
    }
    
    
    
    def get_conn():
        conn = mysql.connector.connect(**config)
        return conn
    
    
    def query_all(cur, sql, args):
        '''
        #参数说明
        :param cur:
        :param sql: 执行的sql
        :param args: sql中的桉树
        :return:
        '''
        print(sql)
        print(args)
        cur.execute(sql, args)
        return cur.fetchall()
    
    def export_excle(filename, sql, outputpath):
        '''
        # 参数说明
        :param filename: 文件名称
        :param sql: 执行脚本
        :param outputpath: 输出路径
        :return:
        '''
        file_count = 0
        try:
            conn = get_conn()
            cur = conn.cursor()
            # 查询结果 tar_file
            results = query_all(cur=cur, sql=sql, args=None)
            print(type(results))
            if len(results):
                file_tar.copy_file(sorce_dir, ods_dir, *results)
                file_tar.tar_file(ods_dir, 'test.tar.gz')
                file_count = file_count + 1
            else:
                print("返回结果为空")
    
    
        finally:
            if conn:
                conn.close()
        return file_count
    
    
    # 结果测试
    if __name__ == "__main__":
       # sql = input("请输入要查询的sql:")
        #filename = input("请输入excle的名字")
        var_loan="'"+sys.argv[1].replace(',',"','")+"'"   #接受jeknins传递的值
        var_type="'"+sys.argv[2].replace(',',"','")+"'"    #接受jeknins传递的值
        arg=[var_loan,var_type]
        print(var_loan+var_type)
        sql='select contract_path  from   contract   where  loadNo  in (%s) and  cid  in(%s);' %(var_loan,var_type)
        print(sql)
        file_count =  export_excle(filename, sql, oddir)  #执行导出结果
        if os.path.exists(filename) and os.path.getsize(filename)>0:
            if file_count >=1:
               print("邮件已经发送 %s"%(mail_list['attfilename']))
               mail_list['attfilename'] = filename
               print("邮件已经发送 %s"%(mail_list['attfilename']))
               send_mail.sendmail(**mail_list)
            else :
               print("文件大小为空,请检查")
        else :
            print("文件不存在,请联系管理员检查脚本是否有异常"
    #!/user/bin/python
    #-*- coding: utf-8 -*-
    import sys
    import os
    import shutil
    import tarfile
    import zipfile
    import io
    # coding:utf8
    # author: xiajq
    # 实现批量输入借据号和uid导出合同并且重名自动打包发送到邮箱需要人的邮箱
    #1、在jenkins 界面输入借据号和uid 2.调用Python脚本实现将邮件自动拷贝到临时目录,打包发送到对应收件人的邮箱
    
    reload(sys)
    sys.setdefaultencoding('utf-8')#添加该方法声明编码
    
    tmp_dir='/test/autocontract'
    tmp_file_list='tmp.txt'
    sorce_dir='/test/usercontract'
    ods_dir='test/tmp'
    def copy_file(sorce_dir,ods_dir,*file_list):
        '''
        拷贝文件
        :param tmp_file_list:   记录文件名字
        :param sorce_dir:  源文件
        :param ods_dir:  目标文件
        :return:
        '''
        for line in list(file_list):
            line = ''.join(line)
            print(line)
            print(type(line))
            new_name = line.replace('/', '_')
            print("开始拷贝")
            print("拷贝后的名称为 %s" % new_name)
            #         ods_file="%s/%s"%(ods_dir,new_name)
            ods_file = ods_dir + '/' + new_name
            print(type(line))
            #            filename=line.strip().encode('utf-8') 
            soure_file = "%s/%s" % (sorce_dir, line)
            print(soure_file)
            print(ods_file)
            shutil.copy(soure_file, ods_file)
            print("拷贝成功")
    
    
    def  tar_file(dir,tarname):
        '''
        打包某个目录下的所有文件
        :param dir: 需要打包的目录
        :param tarname: 打包的名字
        :return:
        '''
        os.chdir(ods_dir)
        tf = tarfile.open(tarname, "w:gz")
        for fname in os.listdir(ods_dir):
            print(fname)
            if fname.endswith(".pdf"):
                tf.add(fname)
        print(tf.members)
        print(tf.name)
        tf.close()

    3、发送邮件

    #coding=utf-8
    import smtplib
    from email.header import Header
    from email.mime.text import MIMEText
    from email.utils import formataddr
    from email.utils import parseaddr, formataddr
    from email.mime.multipart import MIMEMultipart
    
    
    
    mail_list = {
        'sender':'admin@qq.com', #发件人
        'receivers':'test@qq.com', #收件人
        'title':'云测推荐失败数据监控', #邮件主题
        'content':'云测推荐失败数据见附件。请及时查看原因', #邮件内容
        'filename':'',#附件内容
        'server':'localhost' #发送邮件服务器。默认为本机
    }
    
    
    def _format_addr(s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))  #
    
    def sendmail(**kwargs):
        #sender,receivers,title,content,filename,server = 'localhost'
        '''
        :param sender:  发件人 my_sender = 'test1@qq.com,test2@qq.com'
        :param receivers:  收件人
        :param title:  邮件标题
        :param content: 邮件内容
        :param attfilename: 附件名称
        :param server: 服务器的名字默认为localhost,本机
        :return:
        '''
        message = MIMEMultipart()
        message['From'] = _format_addr(kwargs['sender'])
        message['Subject'] = Header(kwargs['title'], 'utf-8')
    #    message['To'] = _format_addr(kwargs['receivers']) #收件人只显示自己
    #    print(kwargs['receivers'])
        message['To'] = kwargs['receivers']# 可以看得见多个收件人
    
    
        #
        message.attach(MIMEText(kwargs['content'], 'plain', 'utf-8'))
        att1 = MIMEText(open(kwargs['attfilename'], 'rb').read(), 'base64', 'utf-8')
        att1["Content-Type"] = 'application/octet-stream'
        att1["Content-Disposition"] = 'attachment; filename=%s'%(kwargs['attfilename'])
        message.attach(att1)
    
        try:
            smtpObj = smtplib.SMTP(kwargs['server'])
            smtpObj.sendmail(kwargs['sender'], kwargs['receivers'].split(','), message.as_string())
            print(kwargs['receivers'].split(','))
        except smtplib.SMTPException:
            print("Error: 无法发送邮件")
  • 相关阅读:
    flask的过滤器
    flask的for、if语法
    flask模版语法
    flask response跳转页面
    flask 简单注册页面
    Egress 网关 TLS 连接 发起的过程 (SDS)
    Egress Gateway
    Egress TLS Origination
    Istio ServiceEntry 访问外部服务
    font awesome icon
  • 原文地址:https://www.cnblogs.com/xiajq/p/11214696.html
Copyright © 2020-2023  润新知