Python中optparse模块使用浅析
最近遇到一个问题,是指定参数来运行某个特定的进程,这很类似Linux中一些命令的参数了,比如ls-a,为什么加上-a选项会响应。optparse模块实现的也是类似的功能,它是为脚本传递命令参数。
使用此模块前,首先需要导入模块中的类OptionParser,然后创建它的一个实例(对象):
fromoptparseimportOptionParser parser=OptionParser() #这里也可以定义类的参数,后续有
接着就可以添加选项了,基本语法:
parser.add_option(opt_str,..., attr=value,...)
每个opt_str可以有多个选项字符串,比如-f和--file(就行Linux命令行中ls-a和ls--all效果一样),只要定义了这些选项,则在命令行输入的时候这些选项就会被识别,否则报错。opt_str的定义可以如下:
parser.add_option("-f","--file",...) #-f和--file是作为调用时的参数的标签,会被识别
当选项被定义好后,则可以调用parse_args()函数来获取我们定义的选项和参数
(options,args)=parser.parse_args()#parse_args可以有参数,不定义的话使用默认的sys.argv[1:]
parse_args()返回两个值,一个是选项options(如:-f),另一个是参数args,即除选项options以外的值(如:test.txt)
add_option中最重要的四个option的属性是:action,type,dest(destination),help。这四个中action又是最基础的。
action参数(附带介绍了type、dest):
action参数告诉optparse该做什么当它在命令行中遇到选项时。action有三种存储方式:store、store_false、store_true。如果不指定action的值,默认的是store,它告诉optparse将继续读取下一个参数(type),保证类型的正确性,并将它将值存储在一个变量(dest)中,即将命令行中输入的字符串将它存为options的属性,这样可以直接调用。啰嗦了一大堆,我自己都被搞晕了~~~~,先看个例子吧!
>>>parser.add_option("-f","--file",action="store",type="string",dest="filename") <Optionat0x2d72f48:-f/--file> >>>args=["-f","foo.txt"]#这个是模拟命令行的输入 >>>(options,args)=parser.parse_args(args) >>>options.filename 'foo.txt'
上述:当optparse看到选项-f时,它将继续读下一个参数是foo.txt,并将它存储在options.filename(这个filename就是add_option中的dest),之后dest的值将作为parser的属性被存储。所以,当调用parse_args函数时,options.filename的值就是foo.txt。这个是以“string”类型存储的,当然type也可以是int和float等,比如下面的:
parser.add_option("-n",type="int",dest="num")
注意,这个没有指定一个长字符串的选项(如:--number),这当然是可以的,不过命令行输入时选项就只能是-n了,也没有指定action,使用默认的“store”。再次使用模拟的命令行参数["-n22"](一个参数),也可以写成["-n 22"](作为两个参数来传递):
>>>parser.add_option("-n",type="int",dest="num") <Optionat0x2d71308:-n> >>>(options,args)=parser.parse_args(["-n22"]) >>>printoptions.num 22
如果不指定type参数,默认的是string类型,所以一个最简单的方式可以写成这样:
parser.add_option("-f",dest="filename")
action另两种值分别是:“store_true”和“store_false”,这一般作为一个标记使用,例如开始运行一个程序时将flag设为True,退出时将flag设为False。看了下面的例子就全明白了:当选项遇到v时,它将options.verbose设为True,当选项遇到q时,它将options.verbose设为False:
>>>fromoptparseimportOptionParser >>>parser=OptionParser() >>>parser.add_option("-v",action="store_true",dest="verbose") <Optionat0x2ceb888:-v> >>>parser.add_option("-q",action="store_false",dest="verbose") <Optionat0x2d68e48:-q> >>>fakeArgs=['-v','hello'] >>>options,args=parser.parse_args(fakeArgs) >>>options.verbose True >>>fakeArgs=['-q','byebye'] >>>options,args=parser.parse_args(fakeArgs) >>>options.verbose False #如果同时写两个选项v和q,它会以哪个为准呢,我试了一下,是以最后出现的为准,呵呵~~ >>>fakeArgs=['-q','byebye','-v','hello'] >>>options,args=parser.parse_args(fakeArgs) >>>options.verbose True
Default参数:
default参数很好理解了,即当没有指定dest的值时,给出个默认值,如下:
>>>parser.add_option("-x",action="store",dest="verbose",default="hahaha") <Optionat0x2d77148:-x> >>>options,args=parser.parse_args()#这里没有传参数 >>>options.verbose 'hahaha'
如果这样的话,那下面这两句的效果就一样了(前提是不给parse_args()函数传参:)
parser.add_option("-v",action="store_true",dest="verbose") parser.add_option("-q",action="store_false",dest="verbose",default=True)
help参数:
这个参数是为了让我们定义的“命令”更为逼真,还提供了帮助消息了呢!呵呵~~简单用法如下:
>>>fromoptparseimportOptionParser >>>usage="myprog[-f<filename>][-s<xyz>]arg1[,arg2..]" >>>parser=OptionParser(usage)#这里为类添加了参数usage >>>optParser.add_option("-f","--file",action="store",type="string",dest="fileName",help="noanyhelp") <Optionat0x2bdb888:-f/--file> >>>fakeArgs=['-f','file.txt'] >>>options,args=parser.parse_args(fakeArgs) >>>options.fileName 'file.txt' >>>parser.print_help() Usage:myprog[-f<filename>][-s<xyz>]arg1[,arg2..]
Options: -h,--help showthishelpmessageandexit #此两行根据option自动生成,比较智能额~~ -fFILENAME,--file=FILENAME noanyhelp #这是我定义的帮助信息(呵呵,不太友好~~) >>>parser.print_usage() Usage:myprog[-f<filename>][-s<xyz>]arg1[,arg2..] #这是类的usage信息~~很逼真,有木有?
>>>