optparse python
来源:互联网 发布:风云无双麒麟进阶数据 编辑:程序博客网 时间:2024/05/17 02:12
转载自:http://koria.blog.hexun.com/15296722_d.html
optparse 是一个能够让程式设计人员轻松设计出简单明了、易于使用、符合标准的Unix 命令列程式的Python 套件。开始学习Python 之后,我常常会写一些小程式来处理日常的工作;渐渐地,我发现无法处理参数的程式的弹性有限,于是就开始为我的程式加上解读命令列参数的功能。在发现这个套件之前,我总是觉得解读命令列不难,但是要做到像标准Unix 命令那样完善的使用者互动和错误处置,可就不是一件简单的事了!某天在Python Library Reference中发现这个套件,真是如获至宝!从此不用再为解读参数烦恼,可以更专注在解决问题上了!
如果对于optparse 套件有兴趣,想快速入门的话,可以直接看"基本使用流程"小节,然后再看后面的一些介绍与说明;当然啦!想获得最详细的资讯,就只有自己去看Python Library Reference啰~ 转载自:http://koria.blog.hexun.com/15296722_d.html转载自:http://koria.blog.hexun.com/15296722_d.html转载自:http://koria.blog.hexun.com/15296722_d.html转载自:http://koria.blog.hexun.com/15296722_d.html转载自:http://koria.blog.hexun.com/15296722_d.html
就以下列命令来解释一些术语,myprog 是命令的名字, $ 是命令列提示符号:
- $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 应该是:
- ["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 的建构子:
- from optparse import OptionParser
- MSG_USAGE = "myprog[ -f <filename>][ -s <xyz>] arg1[, arg2...]"
- optParser = OptionParser(MSG_USAGE)
》2.呼叫OptionParser.add_option() 加入接受的option:
- optParser.add_option("-f",
- "--file",
- action = "store",
- type = "string",
- dest = "fileName")
参数action 有许多种类,预设是"store",所以即使省略也无妨,其它的action 种类在下面会继续说明。
若有一个以上的option,重覆上述的方式加入(注意:以下省略了action 参数):
- optParser.add_option("-s",
- "--someopt",
- type = "string",
- dest = "someopt")
》3.呼叫OptionParser.parse_args() 进行解读。如果没有传入参数, OptionParser 预设会以sys.argv[1:] 为对象进行解读。OptionParser.parse_args() 会传回一个tuple,由optparse.Values 和一个list 所组成。下例传入一个假造的参数列:
- fakeArgs = ['-f', 'thefile.txt', '-s', 'xyz', 'arg1', 'arg2', 'arge']
- options, args = optParser.parse_args(fakeArgs)
- print options.fileName
- print options.someopt
- print args <span class="Apple-style-span" style="font-family: Arial, Verdana, sans-serif; white-space: normal; "> </span>
最后会得到的输出结果:
- thefile.txt
- xyz
- ['arg1', 'arg2', 'arge']
这是一个简单的范例,说明了OptionParser 的一般使用方式。透过这个例子,可以看到如果为程式加入option, 并且在程式中取得option argument 和positional argument。OptionParser.parse_args() 还有许多用法,下面会说明一部份。
为程式加入 flag option:
许多的Unix 命令拥有"-v", "-q" 的option,代表"提供详细讯息"或是"不显示讯息"。要做到这一点,只要在程式中加入下列的option :
- 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 就行了:
- 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,和上一个例子有点不同。再看下一个例子:
- 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 亦可加入预设值:
- parser.add_option("-f", action="store", dest="fileName", default = "defaultConfig.txt")
为程式加入说明:
标准的Unix 命令大多有着"-h", "--help" 的option,会将使用说明印出来。在OptionParser.parse_args() 中指定"help" 参数,并指定说明的字串,就可以为这个option 加入说明了:
- parser.add_option("-v",
- action="store_true",
- dest="verbose",
- default=False,
- help="make lots of noise [default]")
当程式收到"-h" 或"--help",交给OptionParser 解读时,会自动印出说明内容,而忽略其它的argument:
- usage: <yourscript> [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]:
usage = "usage: %prog [options] arg1 arg2"
如果程式名为"myprog",则出现在help 讯息中的usage 就会是:
usage = "usage: myprog [options] arg1 arg2"
如果OptionParser 建构子没有收到任何参数,则会自动产生一个usage 讯息:
"usage: %prog [options]"
前提是程式没有 positional argument。甭担心option 在help 讯息中排列的方式, OptionParser 会搞定一切,如同前面程式所示。
- optparse python
- python optparse
- Python---OptParse
- Python - optparse 之 OptionParser
- python optparse学习笔记
- Python optparse模块
- python模块学习---optparse
- 【python】optparse 模块
- python optparse模块
- Python模块optparse
- python optparse 入门练习
- [python 补充] optparse
- python optparse回顾
- Python optparse模块
- Python Optparse篇
- Python中的optparse模块
- Python--模块之optparse
- Python optparse 解析命令行输入
- Linux ls du 显示目录大小区别
- Objective-C 编程语言官网文档(九)-静态行为
- 在weblogic下部署web应用,加载spring配置文件时要删除注释
- 给浮躁的软件业同仁
- 外企EJB and weblogic 面试问答
- optparse python
- 自动提升Vista、Win7上进程的权限--RT_MANIFEST
- 服饰业供应链变革之路
- VS2005编写Smart device应用程序在编译或链接时找不到文件
- shell 小技巧
- 浅谈ReadWriteLock
- JAVA JDom解析XML
- 函数调用约定和堆栈
- 黑马程序员-java基础 collections