免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4378 | 回复: 0
打印 上一主题 下一主题

python optparse 模块使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-11 17:59 |只看该作者 |倒序浏览

                转自:
http://koria.blog.hexun.com/15296722_d.html

简介:
optparse 是一个能够让程序设计人员轻松设计出简单明了、易于使用、符合标准的 Unix 命令列程序的 Python 套件。开始学习 Python 之后,我常常会写一些小程序来处理日常的工作;渐渐地,我发现无法处理参数的程序的弹性有限,于是就开始为我的程序加上解读命令列参数的功能。在发现这个套件之前,我总是觉得解读命令列不难,但是要做到像标准 Unix 命令那样完善的使用者互动和错误处置,可就不是一件简单的事了!某天在 Python Library
Reference 中发现这个套件,真是如获至宝!从此不用再为解读参数烦恼,可以更专注在解决问题上了!
如果对于 optparse 套件有兴趣,想快速入门的话,可以直接看"基本使用流程"小节,然后再看后面的一些介绍与说明;当然啦!想获得最详细的信息,就只有自己去看 Python Library
Reference 啰~
就以下列命令来解释一些术语,myprog 是命令的名字, $ 是命令列提示符号:

  
  1
  
  
      $myprog -f
  thefile.txt -s xyz a1 a2 a3
  

●argument:
使用者在命令后面所输入的字符串。以本例来说,"-f", "thefile.txt", "-s",
"xyz", "a1", "a2", "a3" 都是 argument。在 Python 中,可以使用 sys.argv[1:] 来得到命令列传进来的 argument。为什么是 sys.argv[1:] ,而不是 sys.argv 呢?因为命令列收到完整的参数还要加上一个命令本身的档名,以本例来说, sys.argv 应该是:

  
  1
  
  
     
  ["myprog", "-f", "thefile.txt",
  "-s", "xyz", "a1", "a2",
  "a3"]
  

所以如果要得到去除命令本身的档名以后的参数列,就要靠 sys.argv[1:] 了。
●option:
一些传递给命令的额外 argument,以改变程序的行为。以本例来说,
"-f", "-s" 就是 option。
有几种 option 的写法,在 Unix 系统上的传统写法是 "-" 后跟着一个字母,例如 "-f",
"-s";以及 "-f -s", 和 "-fs", 在 Unix 系统上都可以被接受。 GNU project 使用另一种方式,以 "--" 后面跟着一串由 "-" 分开的字符串,例如 "--file-for-log"。Python 的 optparse 套件只接受以上所提的两种 option 格式。
顾名思义, option 应该是可有可无的,即使命令中没有任何的 option,程序也应该能够正确地执行。如果程序需要使用者输入某些数据才能运作,那么也应该是使用 positional argument 才对。
●option argument:
紧跟随在 option 后的 argument,就是 option argument。以本例来说, "thefile.txt", "xyz" 都是 option argument。指定 option argument 有两种写法, "-f thefile" 和 "-fthefile", optparse 套件都接受。
option 亦可以没有 option argument,意即 option 单独存在。这样的 option 通常做为旗标 (flag) 用,代表某个功能的开启或是关闭。
●positional argument:
当一个 argument list 被解读完后,剩下的就是 positional argument 了!以本例来说, "a1",
"a2", "a3" 就是 positional
argument。通常被用在"使用者必须输入"的信息上。
●required option:
一个有点让人觉得矛盾的名词:既然是 "option"
(选择),又怎么会是
"required" (必须)的呢? optparse 套件不对这种 option 做出任何的限制或是协助。详情可以参阅 Python Library Reference 6.20.5 的范例程序。
基本使用流程:
》1.产生一个 optparse.OptionParser
的物件。可以在产生时将"程序的命令列说明" (usage) 做为参数,交给 OptionParser 的建构子:

  
  1
  2
  3
  
  
      from optparse
  import OptionParser
      MSG_USAGE =
  "myprog[ -f ][ -s ] arg1[, arg2...]"
      optParser =
  OptionParser(MSG_USAGE)
  

》2.呼叫 OptionParser.add_option()
加入接受的 option:

  
  1
  2
  3
  4
  5
  
  
      optParser.add_option("-f",
                          
  "--file",
                          
  action = "store",
                          
  type = "string",
                           dest =
  "fileName")
  

参数 action 有许多种类,预设是 "store",所以即使省略也无妨,其它的 action 种类在下面会继续说明。
若有一个以上的 option,重复上述的方式加入(注意:以下省略了 action 参数):

  
  1
  2
  3
  4
  
  
      optParser.add_option("-s",
                          
  "--someopt",
                    
        type = "string",
                          
  dest = "someopt")
  

》3.呼叫 OptionParser.parse_args()
进行解读。如果没有传入参数, OptionParser 预设会以 sys.argv[1:] 为对象进行解读。OptionParser.parse_args()
会传回一个 tuple,由 optparse.Values 和 一个 list 所组成。下例传入一个假造的参数列:

  
  1
  2
  3
  4
  5
  6
  7
  
  
      fakeArgs =
  ['-f', 'thefile.txt', '-s', 'xyz', 'arg1', 'arg2', 'arge']
      
      options, args
  = optParser.parse_args(fakeArgs)
      
      print
  options.fileName
      print
  options.someopt
      print args
  

最后会得到的输出结果:

  
  1
  2
  3
  
  
      thefile.txt
      xyz
      ['arg1',
  'arg2', 'arge']
  

这是一个简单的范例,说明了 OptionParser 的一般使用方式。透过这个例子,可以看到如果为程序加入 option, 并且在程序中取得 option argument 和 positional argument。OptionParser.parse_args()
还有许多用法,下面会说明一部份。
为程序加入 flag option:
许多的 Unix 命令拥有 "-v",
"-q" 的 option,代表"提供详细讯息"或是"不显示讯息"。要做到这一点,只要在程序中加入下列的 option :

  
  1
  2
  3
  
  
      parser.add_option("-v",
  action="store_true", dest="verbose")
      parser.add_option("-q",
  action="store_false", dest="verbose")
      opts, args =
  parser.parse_args()
  

第一个 add_option() 加入了一个 "-v" 的 option;如果命令列参数中出现了 "-v",则 opts.verbose 将会是 True;相反的,第二个 add_option() 加入了一个 "-q" option;如果命令列参数中出现了 "-q",则 opts.verbose 将会是 False,这两者并不相悖,程序可以设计成:当收到 "-v" 时,显示详细讯息;当收到 "-q" 时,显示概略讯息,或完全不显示;当两者都没有收到,则显示一般的讯息。
设定 option 的默认值:
上述的例子都假设命令例会收到预期中的 option,那么如果没有 option 时,接收到的 option 值会是什么呢?答案是 None!如果想为 option 提供默认值,只要在 OptionParser.parse_args()中指定参数 default 就行了:

  
  1
  2
  3
  
  
      parser.add_option("-v",
  action="store_true", dest="verbose", default =
  True)
      parser.add_option("-q",
  action="store_false", dest="verbose")
      opts, args =
  parser.parse_args()
  

上述的程序代码为程序加入了两个 option,当 "-v" 没有出现时, opts.verbose 默认值为 True;当 "-q" 被指定时, opts.verbose 被设定为 False,和上一个例子有点不同。再看下一个例子:

  
  1
  2
  
  
  parser.add_option("-v",
  action="store_true", dest="verbose", default=False)
  parser.add_option("-q",
  action="store_false", dest="verbose", default=True)
  

opts.verbose 的默认值会是什么?答案是 True,最后一个指定到同一个目标的 option 默认值会被采用。
一般的 option 亦可加入默认值:

  
  1
  
  
      parser.add_option("-f",
  action="store", dest="fileName", default = "defaultConfig.txt")
  

为程序加入说明:
标准的 Unix 命令大多有着 "-h",
"--help" 的 option,会将使用说明印出来。在 OptionParser.parse_args() 中指定 "help" 参数,并指定说明的字符串,就可以为这个 option 加入说明了:

  
  1
  2
  3
  4
  5
  
  
      parser.add_option("-v",
                       
  action="store_true",
                       
  dest="verbose",
                       
  default=False,
                       
  help="make lots of noise [default]")
  

当程序收到 "-h" 或 "--help",交给 OptionParser 解读时,会自动印出说明内容,而忽略其它的 argument:

  
  1
  2
  3
  4
  5
  6
  7
  8
  9
  
  
      usage:
   [options] arg1 arg2
   
      options:
        -h,
  --help           show this help
  message and exit
        -v,
  --verbose        make lots of noise [default]
        -q,
  --quiet          be vewwy quiet (I'm
  hunting wabbits)
        -fFILE,
  --file=FILE  write output to FILE
        -mMODE,
  --mode=MODE  interaction mode: one of
  'novice', 'intermediate'
                             [default],
  'expert'
  

还记得一开始提到交给 OptionParser 建构子的参数 MSG_USAGE 吗? optparse 套件对 usage 讯息也提供了一些支持。在 usage 中使用 "%prog" 关键词, OptionParser 会自动将其代换为程序名,即 sys.args[0]:

  
  1
  
  
      usage =
  "usage: %prog [options] arg1 arg2"
  

如果程序名为 "myprog",则出现在 help 讯息中的 usage 就会是:

  
  1
  
  
      usage =
  "usage: myprog [options] arg1 arg2"
  

如果OptionParser 建构子没有收到任何参数,则会自动产生一个 usage 讯息:

  
  1
  
  
      "usage:
  %prog [options]"
  

前提是程序没有 positional argument。甭担心 option 在 help 讯息中排列的方式, OptionParser 会搞定一切,如同前面程序所示。
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/14754/showart_1962264.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP