好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

optparse模块

optparse模块

optparse模块

浅谈optparse模块

  最近遇到一个问题,是指定参数来运行某个特定的进程,这很类似Linux中一些命令的参数了,比如ls -a,为什么加上-a选项会响应。optparse模块实现的也是类似的功能,它是为脚本传递命令参数。

  使用此模块前,首先需要导入模块中的类OptionParser,然后创建它的一个实例(对象):

 from  optparse  import   OptionParser
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  "  )
 <Option at 0x2d72f48: -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  "  )
 <Option at 0x2d71308: -n>
>>> (options, args) = parser.parse_args([ "  -n22  "  ])
 >>>  print   options .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:

>>>  from  optparse  import   OptionParser
 >>> parser= OptionParser()
  >>> parser.add_option("-v", action="store_true", dest="verbose")
<Option at 0x2ceb888: -v>
>>> parser.add_option("-q", action="store_false", dest="verbose")
<Option at 0x2d68e48: -q> 
 >>> fakeArgs = ['-v','hello']
>>> options, args = parser.parse_args(fakeArgs)
>>> options.verbose
True
  >>> fakeArgs = ['-q','bye bye']
>>> options, args = parser.parse_args(fakeArgs)
>>> options.verbose
False
 #如果同时写两个选项v和q,它会以哪个为准呢,我试了一下,是以最后出现的为准,呵呵~~
   >>> fakeArgs = ['-q','bye bye','-v','hello']
>>> options, args = parser.parse_args(fakeArgs)
>>> options .verbose
True 

   Default参数:

default参数很好理解了,即当没有指定dest的值时,给出个默认值,如下:

>>> parser.add_option( "  -x  " , action= "  store  " , dest= "  verbose  " , default= "  hahaha  "  )
 <Option at 0x2d77148: -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参数:

这个参数是为了让我们定义的“命令”更为逼真,还提供了帮助消息了呢!呵呵~~简单用法如下:

>>>  from  optparse  import   OptionParser
  >>> usage = "myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]"
>>> parser=OptionParser(usage)  #这里为类添加了参数usage
  >>> optParser.add_option( "  -f  " , "  --file  " ,action =  "  store  " ,type= "  string  " ,dest =  "  fileName  " ,help= "  no any help  "  )
 <Option at 0x2bdb888: -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            show this help message  and   exit   #此两行根据option自动生成,比较智能额~~
    -f FILENAME, --file= FILENAME
                        no any help   #这是我定义的帮助信息(呵呵,不太友好~~)
   >>>    parser.print_usage() 
Usage: myprog[  -f <filename>][-s <xyz> ] arg1[,arg2..]   #这是类的usage信息~~很逼真,有木有?

  >>> 

  

   上述是介绍基本的语法,下面举两个例子,一个是网上找的一个模拟命令行的参数的例子,另一个是“真实”的例子~~~

  Example1:

?

from   optparse import   OptionParser

usage =   "myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]"

optParser =   OptionParser(usage)

optParser.add_option( "-f" , "--file" ,action =   "store" , type = "string" ,dest =   "fileName" )

ooptParser.add_option( "-v" , "--vison" , action = "store_false" , dest = "verbose" ,default = 'None' ,

                      help = "make lots of noise [default]" )

fakeArgs =   [ '-f' , 'file.txt' , '-v' , 'good luck to you' , 'arg2' , 'arge' ] 

options, args =   optParser.parse_args(fakeArgs)

print   options.fileName

print   options.verbose

print   options

print   args

print   optParser.print_help()

  运行结果是:

 file.txt
False
{  '  verbose  ' : False,  '  fileName  ' :  '  file.txt  '  }
[  '  this is some what  ' ,  '  arg2  ' ,  '  arge  '  ]
Usage: myprog[  -f <filename>][-s <xyz> ] arg1[,arg2..]
Options:
   -h, --help            show  this   help message and exit
   -f FILENAME, --file= FILENAME
   -v, --vison           make lots of noise [ default ]

  Example2:

一个简单的例子,就是将给脚本传选项n时,则输出的是n的参数的值,否则给出默认值(脚本保存在E盘):

 from  optparse  import   OptionParser
optParser  =  OptionParser()
optParser.add_option(  "  -n  " , "  --number  " ,action =  "  store  " ,type= "  int  " ,dest =  "  intNumber  "  )
optParser.add_option(  "  -v  " , "  --version  " , action= "  store_false  " , dest= "  verbose  " ,default= '  gggggggg  ' ,help= "  no help  "  )
options, args  =  optParser.parse_args()
  if  options.intNumber  is   not   None:   #当有选项n时,则使用给出的参数值
       #  num = options.intNumber 
     print   options.intNumber,options.verbose

  else  :
      for  i  in  range(1,5 ):   #不给选项n的情况下,默认输出的是1~4
           #  num = i 
         print  i 

打开cmd运行如下:

 

 

 

标签:  Python

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于optparse模块的详细内容...

  阅读:41次