命令行参数解析之getopt和optparse

时间:2021-10-14 14:30:05

当python作为脚本执行时,在命令行中可以传入参数,因此在脚本中如何解析命令行参数就很重要了。sys模块的argv变量就是命令行传入的参数列表,其中argv[0],是脚本命令本身,argv[1:]才是真正的参数列表。python提供了getopt和optparse两个模块来处理命令行参数。其中getopt处理提供了比较简单的处理,但大部分情况下已经足以满足需求,optparse提供了相对强大的处理。想面详细介绍这两个模块


getopt:

getopt模块提供了getopt方法, 该方法返回接写的参数tuple列表,每个元素是参数名和参数值,该方法需要三个参数,第一个参数是需要解析的参数列表,要传入的参数就是argv[1:], 第二个参数是短格式分析串,也就是单个字符的参数名,如-v,-h,该参数形式如:“vh", 表示两个短参数v, 和h,这样的参数之表示一个开关,后面不会带另一个该参数的值,而如果该参数需要参数值,则需要在字符参数后加上":",如:

”vf:h", 这个分析串中v,h不需要参数值,而f参数需要参数值。但这种情况下在命令行下输入参数需要特别注意-f后面必须有参数值,否则后面的参数会被作为其参数值,而对应的参数将不存在。例如:

prog -v -f filename -h 是正确的形式,解析出来的参数列表是:[('-v', ''), ('-f', 'filename'), ('-h','')]

而如果是:

prog -v -f -h,解析出来的参数列表是[('-v', ''), ('-f', '-h')],只有两个参数


第三个参数是长参数列表,如['--help', '--verbose'], 如果需要参数值则在参数名后加'=', 如['--help', '--output=']


getopt具有错误处理,当不能正确解析参数列表时,会抛出错误,如果不捕获该错误,则程序将退出,通常如果参数列表中出现参数列表中没有定义的参数,或者需要值的参数无法读到参数的时候。在程序中可以try..except捕获参数,并打印使用手册


optparse:

optparse提供了比较强大的功能,optparse模块提供了OptionParser类,首先需要创建OptionParser的实例

parser = OptionParser()

然后通过add_option方法添加需要解析的参数;

parser.add_option(短参名,长参名, dest='', action='',help='', default='', type=''), 方法返回的两个值,第一个值是个map,暂命名为options, 存储解析的参数,第一个参数是短参名,如'-f', 第二个是长参名, '--filename', dest是返回值options中的key,对应解析到的值则是key对应的value。action的默认值是'store', 作用是将dest参数存入options中,另外还有'store_true', 'store_false',  这样可以给开关类的参数一个默认值,default制定默认值,当没有参数提供时,则有默认值,另外也可以通过parser的set_defaults()方法设置默认值。type指定参数的类型,如'string', 'int', 当解析到的参数与其需要的类型不一致时,会报错。例子:

parser.add_option('-f', '--file',action='store', default='test', dest='filename' ,help='help text)

这样就可以通过一下方式参数参数列表了:

prog -f filename 或

prog --filename filename

optparser可以自动生产帮助信息,help参数提供了没一个参数的帮助信息,当命令行提供-h, --help参数时,所有的参数帮助信息都会打印

options:  
-h, --help show this help message and exit
-f FILE, --file=FILE write report to FILE
-q, --quiet don't print status messages to stdout


parser的parser_args参数是解析参数的方法,其参数args默认值为sys.argv[1:],当然也可传入另外的参数列表


Usage信息,创建OptionParser时,可以传入usage参数和version参数,当使用-h, --help时首先会打印出usage和version参数


错误处理:

当解析出现错误时optparser同样会打印错误信息并退出程序,另外,也可以通过parser.error()方法打印自定义的错误