首页 > 编程 > Python > 正文

Python命令行解析模块详解

2020-02-22 23:05:13
字体:
来源:转载
供稿:网友

本文研究的主要是Python命令行解析模块的相关内容,具体如下。

Python命令行常见的解析器有两种,一是getopt模块,二是argparse模块。下面就解读下这两种解析器。

getopt模块

这个模块可以帮助脚本解析命令行参数,一般是sys.argv[1:]。它遵循着Unix的getopt()函数相同的约定(用-/--指定命令参数)。这个模块提供两个函数(getopt.getopt()/getopt.gnu_getopt())和一个参数异常(getopt.GetoptError)。

这里重点介绍getopt.getopt()这个函数。

函数原型:getopt.getopt(args, options[, long_options])

这个函数有三个参数:

args:脚本要解析的命令行参数; options:命令行短选项,如果指定的短选项后面需要跟参数的话,要在相应短选项后面加“:”,如e:; long_options:命令行长选项,这个参数是可选的。如果指定的长选项后面要跟参数的话,要在相应长选项后面加上“=”,如conding=;

当给定的命令行参数解析不了的话,就会抛出GetoptError异常。

函数的返回值包含两个元素:

第一个元素是一个(option,value)元组对。Option是解析的参数,value是对应参数的值; 第二个元素是脚本不需要执行的参数列表。也就是这些参数是多余的;

下面看几个Demo:

短选项:

>>> importgetopt>>> args='-a -b -cfoo -d bar a1 a2'.split()>>> args['-a', '-b', '-cfoo', '-d', 'bar', 'a1','a2']>>> optlist, args= getopt.getopt(args,'abc:d:')>>> optlist[('-a', ''), ('-b', ''), ('-c', 'foo'),('-d', 'bar')]>>> args['a1', 'a2']

长选项:

>>> s='--condition=foo --testing --output-file abc.def -x a1 a2'>>> args= s.split()>>> args['--condition=foo', '--testing','--output-file', 'abc.def', '-x', 'a1', 'a2']>>> optlist, args= getopt.getopt(args,'x', [...   'condition=','output-file=','testing'])>>> optlist[('--condition', 'foo'), ('--testing', ''),('--output-file', 'abc.def'), ('-x', '')]>>> args['a1', 'a2']

在脚本当中经典的应用实例:

importgetopt,sys defmain():  try:    opts, args = getopt.getopt(sys.argv[1:],"ho:v", ["help","output="])  except getopt.GetoptErroras err:    # print help information and exit:    printstr(err) # will print something like "option -a not recognized"    usage()    sys.exit(2)  output =None  verbose =False  for o, a in opts:    if o =="-v":      verbose =True    elif o in ("-h","--help"):      usage()      sys.exit()    elif o in ("-o","--output"):      output = a    else:      assertFalse,"unhandled option"  # ... if __name__ =="__main__":  main()

argparse模块

argparse模块使得编写用户友好的命令行接口非常容易。程序只需定义好它要求的参数,然后argparse将负责如何从sys.argv中解析出这些参数。argparse模块还会自动生成帮助和使用信息并且当用户赋给程序非法的参数时产生错误信息。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表