让python程序更linux

来源:互联网 发布:overwolf是什么软件 编辑:程序博客网 时间:2024/05/22 14:45

喜欢linux的人,一定喜欢shell,一定了解grep ,awk, sed .......

linux的魅力在于所有人能够将各种各样简单的东西通过shell这种胶水任意的揉在一起。来实现强大的功能。最典型的就是编辑利器,vim。

组合的方式有很多,但是最让人爱不释手的就是管道。


前几天突发奇想, 随手写过很多python小工具。如果能够把管道的能力也引进过来,那岂不是妙哉?

在linux中,文件处理是我们基本上天天要干的事情(所有东西都是文件)。

相信这样的语句:

cat /tmp/data.txt | grep sshd  > temp.txt

让人再熟悉不过了。

那么我们可不以这样:

cat /tmp/data.txt | python filterLine.py -l 3 | grep "hello"

这样就能无缝的用linux的思想,把我们的python脚本通过管道聚合起来。


好吧。整理下需求:

  1. 脚本过滤出行号%N == 0 的行。作为结果返回
  2. N需要作为脚本参数传入
  3. 脚本接收标准输入
  4. 脚本将结果通过标准输出打印

废话不多说,我们一步一步来:


1. 核心功能,过滤行,并将结果输出:

def lineFilter(baseNum, lCount, line):    if baseNum % lCount == 0:        print line

2. 脚本可以接收参数:

python2.7引入了一个很实用的模块:argparse。他可以完美的配置你的参数列表,并生成很专业的help信息。

import argparse parser = argparse.ArgumentParser(description='filter line.')parser.add_argument('-l', dest='lineNum', type=int,                    help='an integer for the line num')args = parser.parse_args()

3. 脚本接收标准输入:

其实实现起来很简单,只需要读取 sys.stdin 就好。

import sysfor l in sys.stdin:    dosomething ......

好了,所有需求都实现了。我们把它整合在一起:

import sysimport argparse parser = argparse.ArgumentParser(description='filter line.')parser.add_argument('-l', dest='lineNum', type=int,                    help='an integer for the line num')args = parser.parse_args()def lineFilter(baseNum, lCount, line):    if baseNum % lCount == 0:        print lineif __name__ == "__main__":    lCount = 0    for line in sys.stdin:        lCount += 1        lineFilter(args.lineNum, lCount, line)    sys.exit(0)

记得在程序退出的时候加上sys.exit(0)。

这是一个好习惯。因为我们经常需要在一个命令执行完成之后,将命令执行的结果状态返回,以供接下来的流程判断,比如:

ls /tmp/sdfsdfsdfffsd#其实没有这个文件夹if [ $? -ne 0 ]then    echo "error"fi


*声明,欢迎转载,但请注明出处,亲。

原创粉丝点击