【Python模块】命令行解析--argparse

python命令行解析

前言

当你还在使用

if len(sys.argv) > 1

这样的方式判断选项和参数的时候,是否已意识到已经落伍了。

我在bash中用过getopt getopts,我用完之后,就再也不记得他们,需要的时候又抄袭过来。
在perl中有好很多的模块GetOpt::Std,GetOpt::Long

python也有getopt的模块,按照c的风格使用。

我们跳过这里,直接进入更强大的阶段optparse,一种更友好的面向对象的方式,至少不需要getopt之后,进行一系列的if elif的判断。

随着模块的发展,最终argparse替换了它,详细原因可以参考PEP0389

学习

过一下手册,HOWTO,最终自己练习一下,来记住这个模块。

HOWTO

HOWTO比较简单,掌握了基本的用法。还有一些参数太多,不太常用的,可以慢慢摸索。看一下标准库第一个例子,查询一下里面几个参数。

标准库

练习

写一个自己的需求的程序,比较简单

需要

选项
-s 或者–safe 不带参数,变量为true或false;判断是否执行删除操作

-o 或者–output 参数为可写文件,如果没有参数,就默认生成一个tmp目录下的文件

参数
dir , 表示一个目录,缺省值为当前目录 .


import argparse

parser = argparse.Argumentparser(description="This is a de-duplicate tool")

parser.add_argument("dir",default=".",
                    help="target directory")
parser.add_argument("-s","--safe","--scan",
                    action="store_true",dest="not_delete",
                    help="scan directory only ,don't delete file")
parser.add_argument("-o","--output",type=FileType("w"),
                    default=generate_tmp())
args = parser.parse_args()

print "Dir:{}".format(args.dir)
if args.not_delete:
    print "we are in safe mode."
print "output file:%s".format(args.output.name)

在txt上写好了
1.发现Argumentparser这个拼写错了,这个居然是驼峰的风格。
2.发现python 有生成零时文件的函数。
3.FileType这个是argparse里的方法
fix it


import argparse
import os

parser = argparse.ArgumentParser(description="This is a de-duplicate tool")

parser.add_argument("dir",default=".",
                    help="target directory")
parser.add_argument("-s","--safe","--scan",
                    action="store_true",dest="not_delete",
                    help="scan directory only ,don't delete file")
parser.add_argument("-o","--output",type=argparse.FileType("w"),
                    default=os.tmpfile())
args = parser.parse_args()

print "Dir:{}".format(args.dir)
if args.not_delete:
    print "we are in safe mode."
print "output file:%s".format(args.output.name)

发现os.tmpfile不会返回路径,文件描述符消失时,自动删除文件

重找 tempfile 模块,这个模块居然也有坑,不是一个文件描述符,是操作系统描述符。好大一个

可以-o的默认参数改成None,做一些处理,获得需要的文件路径和文件描述符,形成统一。

import argparse
import os
import tempfile

parser = argparse.ArgumentParser(description="This is a de-duplicate tool")

parser.add_argument("dir",default=".",
                    help="target directory")
parser.add_argument("-s","--safe","--scan",
                    action="store_true",dest="not_delete",
                    help="scan directory only ,don't delete file")
parser.add_argument("-o","--output",type=argparse.FileType("w"),
                    help="output of scan result")
args = parser.parse_args()

print "Dir:{}".format(args.dir)
if args.not_delete:
    print "we are in safe mode."

output_fifo=""
output_filename=""
if args.output:
    output_fifo=args.output
    output_filename=args.output.name
else:
    fd, output_filename=tempfile.mkstemp(prefix="dedu-",suffix=".log")
    output_fifo=os.fdopen(fd,"w")   

print "output file:{}".format(output_filename)
output_fifo.close()
posted @ 2016-01-15 16:38  程序员杰诺斯  阅读(175)  评论(0编辑  收藏  举报