• python 之调用Linux shell命令及相关高级应用


      最近根据老大要求,将数据进行同步备份,结合第三方提供的工具。第三方服务其实是有python demo的,本想研究下实际的python sdk搞个demo开发的,但是发现有些组建装起来确实头大,而且本公司线上的python版本也确实够低只能另想办法。

      最终确定方案如下:利用第三方提供的相关管理工具(当然是Linux下的),通过python调用系统工具(本人对shell在这方面不是特别感冒,当然文本处理除外),然后将脚本输出重定向到日志文件中,方便检查文件上传成功或失败的具体情况处理。

      那么就会设计到三个问题:1、上传的文件列表(由于涉及到与客户端接口key问题,还要进行处理,不能为绝对路径);2、调用第三方提供的包,用工具进行上传;3、输出日志的分析处理

      针对于第一个问题,功能函数如下:

     1 import os,re
     2 pathname = open('pathlist.txt','w+')
     3 filename = open('filelist.txt','w+')
     4 
     5 def find_file(arg, dirname, files):
     6     for file in files:
     7         file_path = os.path.join(dirname, file)
     8         if os.path.isfile(file_path):
     9             pathname.write('%s 
    ' % file_path)
    10 
    11 def key(file):
    12     tmppathname = open(file,'r')
    13     for line in tmppathname:
    14         line_tmpA = re.split('aaa',line)  #由于key的规则后端已经设置好了,那么在脚本中也要做相应的处理,通过分隔符来处理实际的需求,需要什么就给什么,通过list实现
    15         line_tmpB = str(line_tmpA[1])
    16         filename.write('%s' % line_tmpB)
    17 
    18 os.path.walk(r"/a/b/c/aaa",find_file,())
    19 
    20 key('filelist.txt')

      到了第二部分python函数中嵌套shell命令:

      

    1 def backup(file):
    2     tmppathname = open(file,'r')
    3     for key in tmpfilename:
    4         localfile = '/a/b/c/aa'+key #其中key和localfile为第三方工具包需要的参数
    5         os.environ['key'] = key  #通过os.environ将需要传递的参数变量做赋值
    6         os.environ['localfile'] = localfile
    7         os.system('proxy-client --action put --bucket aaa --key $key --file $localfile')
    8 
    9 backup('filelist.txt')

      第二部分的实现还是比较简单的,到了第三部分日志环节的处理由于是初次遇见处理起来比较麻烦,通过cat log.txt 和less log.txt发现结果分别如下图:

      

      

      cat 执行后发现进度条是动态处理的,但是less查看日志文件后发现很多特殊符号,本人在这一步的处理花了点时间(初次遇到),有考虑过用正则去匹配,可是发现最后的输出确实NoneType,也许是本人的功夫还没到家==!。一直考虑这个看起来形如^H的如何处理,查了半天发现这货竟然是个输出不显示的组合键。。。。。。还是个组合键,所以在处理的时候并不是简单的依葫芦画瓢,写上^H,而应该是Ctrl+v 然后继续Ctrl+H,这样才可以对这个特殊字符进行处理。所以第三部分的代码如下:

      

     1 #!/usr/bin/env python
     2 import re,string
     3 logname = open('log_online.txt','r')
     4 logtest = open('log_test.txt','w+')
     5 for line in logname:
     6 #       print type(line)
     8 #       print line_a
     9         line_b = line_a.split('>')
    10 #       print type(line_b)
    11         logtest.write(line_b[-1]) #这里主要考虑到输出结果中并不一定都是上传成功的案例,所以通过分析规律发现取分隔符>最后一个元素即为上传结果。
    12 logtest.close()

      这是当时测试过程写的,也比较接单,关键就是思路问题。

      与大家共勉!

  • 相关阅读:
    效率神器-uTools推荐和使用
    sqlserver数据库脱机和分离的区别
    JS "&&"操作符妙用
    小程序图片添加视频播放按钮图标
    js将秒数转换为时分秒格式
    分享一波技术党适合做浏览器首页的网站
    Coursera课程笔记----C++程序设计----Week7
    Coursera课程笔记----C++程序设计----Week6
    Coursera课程笔记----C++程序设计----Week5
    Coursera课程笔记----C++程序设计----Week4
  • 原文地址:https://www.cnblogs.com/kirago/p/4234268.html
Copyright © 2020-2023  润新知