脚本输入输出重定向

背景

看了一下现在招聘,都是要求一门脚本语言,而且最好是python,不难理解,现在监控和自动化运维最成功的估计就是python,已经学了scala了,不想再学ruby这种和scala一样甜的语言,那就写写python吧

目标

把linux shell编程艺术书上的脚本用python实现一遍,千里之行始于足下,说干就干

1

执行命令,将命令结果追加到文件

思路

sys.argv是个list,那么用切片应该是最简单和直观的,sys.argv[0]表示文件本身的路径,那么这个数组从1开始切片,终止则是倒数第二个,而倒数第一个则作为文件的输出路径

#!/usr/bin/python3.5
import sys
import os


for cmd in sys.argv[1:-1]:
    os.system('{command} >> {out_path}'.format(command=cmd, out_path=sys.argv[-1]))
    split_line = '*' * len(cmd)
    os.system('echo \'{line}\' >> {out_path}'.format(line=split_line, out_path=sys.argv[-1]))

脚本输入输出重定向_第1张图片
但是这种做法一点也不python,还是用的shell的知识,所以后面又研究了一下,写了个新的

#!/usr/bin/python3.5
import sys
import os

# for cmd in sys.argv[1:-1]:
# os.system('{command} >> {out_path}'.format(command=cmd, out_path=sys.argv[-1]))
# split_line = '*' * len(cmd)
# os.system('echo \'{line}\' >> {out_path}'.format(line=split_line, out_path=sys.argv[-1]))

os.system('rm {out}'.format(out=sys.argv[-1]))
with open(sys.argv[-1], 'w') as file:
    for cmd in sys.argv[1:-1]:
        res = os.popen(cmd)
        for f in res.readlines():
            file.write(f)
        file.write(len(cmd) * '*' + '\n')

感觉好多了

再加点难度

#!/usr/bin/python3.5
import subprocess
import sys

with open(sys.argv[-1], 'w') as file:
    for (cmd, i) in dict(zip(sys.argv[1:-1], range(len(sys.argv) - 2))).items():
        p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        (std_output, error_output) = p.communicate()
        file.write(str(i) + 'out' + '*' * len(cmd) + '\n')
        file.write(str(std_output, encoding='utf8'))
        file.write(str(i) + 'error' + '*' * len(cmd) + '\n')
        file.write(str(error_output, encoding='utf8'))

你可能感兴趣的:(python)