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()