Python学习笔记之参数解析

python提供了两种方法进行命令行的参数解析,分别是getoptoptparse类中的模块OptionParser,下面分别详细了解这两个模块:

1.getopt模块

首先复习C语言的命令行解析:

在C语言里,main函数的原型为int main(int argc, char *argv[]),argc指的是命令行传入的参数个数(程序的name为第一个参数),而argv(*argv[]也可以为**argv)则是一个指针数组,每一个元素为指向一个命令行参数的指针。示例如下:

C语言参数解析

getopt函数原型:

  • getopt.getopt(args, shortopts, longopts=[])

参数解释:

  • args:args为需要解析的参数列表。一般使用sys.argv[1:],这样可以过滤掉第一个参数(ps:第一个参数是脚本的名称,它不应该作为参数进行解析)
  • shortopts:短参数列表
  • longopts:长参数列表

返回值:

  • opts:解析的(option, value)列表对。
  • args:不属于格式信息的剩余命令行参数列表。

在Python里,命令行的参数和C语言很类似(Python解释器是用C语言实现的)。在Python里的命令行参数是存储在sys.argv里,argv是一个列表,第一个元素为程序名称。

下面通过例子了解 getopt模块:

 getopt模块的使用分为三个步骤:

1.导入getopt,sys模块。

2.分析命令行参数。

3.处理结果。

第一步:导入模块

import sys,getopt

第二步:处理方法如下(脚本名为test.py)

try:  
    opts, args = getopt.getopt(sys.argv[1:], "ho:", ["help", "output="])  
except getopt.GetoptError:  
    # print help information and exit: 

解释如下:

1. 处理所使用的函数叫getopt(),因为是直接使用import导入的getopt模块,所以要加上限定getopt才可以。 
2. 使用sys.argv[1:] 过滤掉第一个参数(它是执行脚本的名,不应算作参数的一部分)。 
3. 使用短格式分析串"ho:"。当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个":" 号 。所以"ho:" 就表示"h" 是一个开关选项;"o:" 则表示后面应该带一个参数。 
4. 使用长格式分析串列表:["help", "output="] 。长格式串也可以有开关状态,即后面不跟"=" 号。如果跟一个等号则表示后面还应有一个参数 。这个长格式表示"help" 是一个开关选项;"output=" 则表示后面应该带一个参数。 
5. 调用getopt函数。函数返回两个列表:opts 和args。opts为分析出的格式信息。args为不属于格式信息的剩余的命令行参数。opts是一个两元组的列表。每个元素为:( 选项串, 附加参数)。如果没有附加参数则为空串。 
6. 整个过程使用异常来包含,这样当分析出错时,就可以打印出使用信息来通知用户如何使用这个程序。在没有找到参数列表或选项的需要的参数为空时会触发该异常Exception getopt.GetoptError。异常的参数是一个字符串,表示错误的原因。

如上面解释的一个命令行例子为: 

python test.py -h -o file --help --output=out file1 file2

在分析完成后,opts 应该是: 

[('-h', ''), ('-o', 'file'), ('--help', ''), ('--output', 'out')]

而args 则为:

['file1', 'file2']

第三步:主要是对分析出的参数进行判断是否存在,然后再进一步处理。主要的处理模式为:

for key, val in opts:  
    if key in ("-h", "--help"):  
        usage() #处理参数 
        sys.exit()  
    elif key in ("-o", "--output"):  
        output = val

示例如下:

getopt示例

2.OptionParser模块

optparse模块是Python中用来编写命令行工具的包,尤其是其中的OptionParser类它功能强大,非常好用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。
使用OptionParser类的流程是:

1)建立一个OptionParser类的实例作为命令行解析器;

2)使用创建的解析器定义命令行的格式、帮助信息等等。

3)从用户输入中获取命令行的对应信息并使用。

1)建立解析器

创建解析器很简单实例化类OptionParser,定义 opt = optparse.OptionParser(),该类创建时可以不提供任何参数,不过标准库为我们提供了很多有用的参数可以初始化很多有用的信息。进入类OptionParser中可以看到标准库为我们提供的初始化参数:

类OptionParser初始化参数

首先来看usage与prog(用于替换version和usage里面的prog)参数:

usage与prog示例

version参数:

version参数示例

descripiton参数:

descripiton参数示例

add_help_option参数(默认为True):

add_help_option参数示例

 epilog参数:

epilog参数参数示例

2)定义命令行的构成

定义命令行的构成有多种方法,标准库推荐的做法是使用optparse.OptionParser.add_option方法。add_option有两种调用方法,一种是以optparse.make_option返回的optparse.option实例做为参数,另一种是传入能够作为make_option方法的参数的参数,如各种位置参数和关键字参数等。注意定义options出错会引发optparse.OptionError异常。
第一种方法:

命令行

第二种方法(add_option):

 先看一个示例:

add_option示例

add_option中有多个参数分别为:

action:存储方式,可以为("store","store_const","store_true","store_false","append","append_const","count","callback","help","version")

type:类型("string", "int", "long", "float", "complex", "choice")

dest:存储的变量

default:默认值

help:帮助信息

 1)首先来看action

  • store,store_false,store_true
action中的store,store_false,store_true示例

结果分析总结:

当action=store_true时,当指定-s参数,且后面有值,此时options.mode为True。-s后面无值时options.mode为False;

当action=store_false时,当指定-v参数,此时options.mode为False。-v后面无值时options.mode为False;

当未指定参数-s或者-v时options.mode为None;

未指定默认为action=store_true。

  • store_const
store_const示例

结果分析总结:

指定action = 'store_const', const,则此时options.score的值为const的值,不回受参数后面的值影响。

  • append
appand示例

结果分析总结:

指定action为append时,此时dest=money会将-a后面的值添加到default中并赋值给money(为一个列表)。

  • version
version示例
  • help
help示例
  • count
count示例
  • callback
callback示例
限制位置参数的个数

2)type

optparse模块有6种内建类型:int、long、float、complex、string、choice,对于string类型的输入不做检查;对于int或者long,如果:

i)输入以0x开头,以十六进制读入。 
ii)输入以0开头,以八进制读入。 
iii)输入已0b开头,以二进制读入。 
iv)其他情况,以十进制读入。

其实对于int和long会调用int()和long()进行转换,如果转换失败会抛出异常。float和complex的读取规则与int、long类似。choice是string的衍生类,是string的列表,指出允许的取值列表,如果输入错误引发OptionValueError异常。 

type主要来看choice:

type中的choice示例

结果分析总结:

int、long、float、complex、string中的int已在append中使用将-a后面的参数(字符串)转换为int类型加入到default中。其他类似。choice为指定-t后面的参数只能为choices中的值,否则会触发异常。

3)参数解析

通过前面 1)创建解释器、2)定义命令行格式都是为了获取用户的输入。
(options, args) = parser.parse_args() ,其中options为一个类,通过print(options.__dict__)可以看出类中的变量,通过options.key来访问,同时会将多余的参数
其他没解析完的给args。

参数解析示例

3.参考文献

https://blog.csdn.net/xumingwei12345/article/details/51776884

https://blog.csdn.net/a464057216/article/details/47375999

 

posted @ 2019-01-31 21:56  pointerC++  阅读(1270)  评论(0编辑  收藏  举报