Python中optionParser模块的使用方法实例教程


Posted in Python onAugust 29, 2014

本文以实例形式较为详尽的讲述了Python中optionParser模块的使用方法,对于深入学习Python有很好的借鉴价值。分享给大家供大家参考之用。具体分析如下:

一般来说,Python中有两个内建的模块用于处理命令行参数:

一个是 getopt,《Deep in python》一书中也有提到,只能简单处理 命令行参数;

另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。

示例如下:

from optparse import OptionParser 
parser = OptionParser() 
parser.add_option("-p", "--pdbk", action="store_true", 
   dest="pdcl", 
   default=False, 
   help="write pdbk data to oracle db") 
parser.add_option("-z", "--zdbk", action="store_true", 
   dest="zdcl", 
   default=False, 
   help="write zdbk data to oracle db") 
(options, args) = parser.parse_args() 
if options.pdcl==True: 
 print 'pdcl is true' 
if options.zdcl==True: 
 print 'zdcl is true'

add_option用来加入选项,action是有store,store_true,store_false等,dest是存储的变量,default是缺省值,help是帮助提示

最后通过parse_args()函数的解析,获得选项,如options.pdcl的值。
 
下面是一个使用 optparse 的简单示例:

from optparse import OptionParser 
[...] 
parser = OptionParser() 
parser.add_option("-f", "--file", dest="filename", 
   help="write report to FILE", metavar="FILE") 
parser.add_option("-q", "--quiet", 
   action="store_false", dest="verbose", default=True, 
   help="don't print status messages to stdout") 
(options, args) = parser.parse_args()

现在,你就可以在命令行下输入:

<yourscript> --file=outfile -q 
<yourscript> -f outfile --quiet 
<yourscript> --quiet --file outfile 
<yourscript> -q -foutfile 
<yourscript> -qfoutfile

上面这些命令是相同效果的。除此之外, optparse 还为我们自动生成命令行的帮助信息:

<yourscript> -h 
<yourscript> --help

输出:

usage: <yourscript> [options] 
 
options: 
 -h, --help  show this help message and exit 
 -f FILE, --file=FILE write report to FILE 
 -q, --quiet  don't print status messages to stdout

简单流程

首先,必须 import OptionParser 类,创建一个 OptionParser 对象:

from optparse import OptionParser 
 
[...] 
 
parser = OptionParser()

然后,使用 add_option 来定义命令行参数:

parser.add_option(opt_str, ..., 
   attr=value, ...)

每个命令行参数就是由参数名字符串和参数属性组成的。如 -f 或者 ?file 分别是长短参数名:

parser.add_option("-f", "--file", ...)

最后,一旦你已经定义好了所有的命令行参数,调用 parse_args() 来解析程序的命令行:

(options, args) = parser.parse_args()

注: 你也可以传递一个命令行参数列表到 parse_args();否则,默认使用 sys.argv[:1]。
parse_args() 返回的两个值:
① options,它是一个对象(optpars.Values),保存有命令行参数值。只要知道命令行参数名,如 file,就可以访问其对应的值: options.file 。
② args,它是一个由 positional arguments 组成的列表。

Actions

action 是 parse_args() 方法的参数之一,它指示 optparse 当解析到一个命令行参数时该如何处理。actions 有一组固定的值可供选择,默认是'store ',表示将命令行参数值保存在 options 对象里。

示例代码如下:

parser.add_option("-f", "--file", 
   action="store", type="string", dest="filename") 
args = ["-f", "foo.txt"] 
(options, args) = parser.parse_args(args) 
print options.filename

最后将会打印出 “foo.txt”。

当 optparse 解析到'-f',会继续解析后面的'foo.txt',然后将'foo.txt'保存到 options.filename 里。当调用 parser.args() 后,options.filename 的值就为'foo.txt'。
你也可以指定 add_option() 方法中 type 参数为其它值,如 int 或者 float 等等:

parser.add_option("-n", type="int", dest="num")

默认地,type 为'string'。也正如上面所示,长参数名也是可选的。其实,dest 参数也是可选的。如果没有指定 dest 参数,将用命令行的参数名来对 options 对象的值进行存取。
store 也有其它的两种形式: store_true 和 store_false ,用于处理带命令行参数后面不 带值的情况。如 -v,-q 等命令行参数:

parser.add_option("-v", action="store_true", dest="verbose") 
parser.add_option("-q", action="store_false", dest="verbose")

这样的话,当解析到 '-v',options.verbose 将被赋予 True 值,反之,解析到 '-q',会被赋予 False 值。
其它的 actions 值还有:
store_const 、append 、count 、callback 。

默认值

parse_args() 方法提供了一个 default 参数用于设置默认值。如:

parser.add_option("-f","--file", action="store", dest="filename", default="foo.txt") 
parser.add_option("-v", action="store_true", dest="verbose", default=True)

又或者使用 set_defaults():

parser.set_defaults(filename="foo.txt",verbose=True) 
parser.add_option(...) 
(options, args) = parser.parse_args()

生成程序帮助

optparse 另一个方便的功能是自动生成程序的帮助信息。你只需要为 add_option() 方法的 help 参数指定帮助信息文本:

usage = "usage: %prog [options] arg1 arg2" 
parser = OptionParser(usage=usage) 
parser.add_option("-v", "--verbose", 
   action="store_true", dest="verbose", default=True, 
   help="make lots of noise [default]") 
parser.add_option("-q", "--quiet", 
   action="store_false", dest="verbose", 
   help="be vewwy quiet (I'm hunting wabbits)") 
parser.add_option("-f", "--filename", 
   metavar="FILE", help="write output to FILE"), 
parser.add_option("-m", "--mode", 
   default="intermediate", 
  help="interaction mode: novice, intermediate, " 
   "or expert [default: %default]")

当 optparse 解析到 -h 或者 ?help 命令行参数时,会调用 parser.print_help() 打印程序的帮助信息:

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) 
 -f FILE, --filename=FILE 
   write output to FILE 
 -m MODE, --mode=MODE interaction mode: novice, intermediate, or 
   expert [default: intermediate]

注意: 打印出帮助信息后,optparse 将会退出,不再解析其它的命令行参数。
以上面的例子来一步步解释如何生成帮助信息:

① 自定义的程序使用方法信息(usage message):
 
usage = "usage: %prog [options] arg1 arg2" 
这行信息会优先打印在程序的选项信息前。当中的 %prog,optparse 会以当前程序名的字符串来替代:如 os.path.basename.(sys.argv[0])。
如果用户没有提供自定义的使用方法信息,optparse 会默认使用: “usage: %prog [options]”。
② 用户在定义命令行参数的帮助信息时,不用担心换行带来的问题,optparse 会处理好这一切。
③ 设置 add_option 方法中的 metavar 参数,有助于提醒用户,该命令行参数所期待的参数,如 metavar=“mode”:

-m MODE, --mode=MODE

注意: metavar 参数中的字符串会自动变为大写。
④ 在 help 参数的帮助信息里使用 %default 可以插入该命令行参数的默认值。

如果程序有很多的命令行参数,你可能想为他们进行分组,这时可以使用 OptonGroup:

group = OptionGroup(parser, ``Dangerous Options'', 
   ``Caution: use these options at your own risk. `` 
   ``It is believed that some of them bite.'') 
group.add_option(``-g'', action=''store_true'', help=''Group option.'') 
parser.add_option_group(group)

下面是将会打印出来的帮助信息:

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' 
 
 Dangerous Options: 
 Caution: use of these options is at your own risk. It is believed that 
 some of them bite. 
 -g   Group option.

显示程序版本

象 usage message 一样,你可以在创建 OptionParser 对象时,指定其 version 参数,用于显示当前程序的版本信息:

parser = OptionParser(usage="%prog [-f] [-q]", version="%prog 1.0")

 
这样,optparse 就会自动解释 ?version 命令行参数:

$ /usr/bin/foo --version 
foo 1.0

处理异常

包括程序异常和用户异常。这里主要讨论的是用户异常,是指因用户输入无效的、不完整的命令行参数而引发的异常。optparse 可以自动探测并处理一些用户异常:

$ /usr/bin/foo -n 4x 
usage: foo [options] 
 
foo: error: option -n: invalid integer value: '4x' 
 
$ /usr/bin/foo -n 
usage: foo [options] 
 
foo: error: -n option requires an argument

用户也可以使用 parser.error() 方法来自定义部分异常的处理:

(options, args) = parser.parse_args() 
[...] 
if options.a and options.b: 
 parser.error("options -a and -b are mutually exclusive")

上面的例子,当 -b 和 -b 命令行参数同时存在时,会打印出“options -a and -b are mutually exclusive“,以警告用户。
如果以上的异常处理方法还不能满足要求,你可能需要继承 OptionParser 类,并重载 exit() 和 erro() 方法。

完整的程序例子如下:

from optparse import OptionParser 
[...] 
def main(): 
 usage = "usage: %prog [options] arg" 
 parser = OptionParser(usage) 
 parser.add_option("-f", "--file", dest="filename", 
   help="read data from FILENAME") 
 parser.add_option("-v", "--verbose", 
   action="store_true", dest="verbose") 
 parser.add_option("-q", "--quiet", 
   action="store_false", dest="verbose") 
 [...] 
 (options, args) = parser.parse_args() 
 if len(args) != 1: 
 parser.error("incorrect number of arguments") 
 if options.verbose: 
 print "reading %s..." % options.filename 
 [...] 
 
if __name__ == "__main__": 
 main()

相信本文所述对大家的Python程序设计有一定的借鉴价值。

Python 相关文章推荐
Python 文件读写操作实例详解
Mar 12 Python
在Python3中使用asyncio库进行快速数据抓取的教程
Apr 02 Python
编写简单的Python程序来判断文本的语种
Apr 07 Python
python对指定目录下文件进行批量重命名的方法
Apr 18 Python
django使用html模板减少代码代码解析
Dec 12 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
Mar 13 Python
Python之时间和日期使用小结
Feb 14 Python
Django 创建后台,配置sqlite3教程
Nov 18 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
Nov 21 Python
keras 权重保存和权重载入方式
May 21 Python
Python+OpenCV图像处理——图像二值化的实现
Oct 24 Python
python 邮件检测工具mmpi的使用
Jan 04 Python
python基础教程之缩进介绍
Aug 29 #Python
python基础教程之常用运算符
Aug 29 #Python
python基础教程之序列详解
Aug 29 #Python
Python获取电脑硬件信息及状态的实现方法
Aug 29 #Python
python基础教程之基本数据类型和变量声明介绍
Aug 29 #Python
python基础教程之Hello World!
Aug 29 #Python
python中的多线程实例教程
Aug 27 #Python
You might like
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
php正则匹配html中带class的div并选取其中内容的方法
2015/01/13 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
php头像上传预览实例代码
2017/05/02 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
jquery html动态生成select标签出问题的解决方法
2013/11/20 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
解决json日期格式问题的3种方法
2014/02/02 Javascript
一款由jquery实现的整屏切换特效
2014/09/15 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
Nodejs下DNS缓存问题浅析
2016/11/16 NodeJs
Vue AST源码解析第一篇
2017/07/19 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
python中dir函数用法分析
2015/04/17 Python
python3.5仿微软计算器程序
2020/03/30 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
对TensorFlow的assign赋值用法详解
2018/07/30 Python
Django框架模板介绍
2019/01/15 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
python随机生成库faker库api实例详解
2019/11/28 Python
快速查找Python安装路径方法
2020/02/06 Python
python实现简单井字棋游戏
2020/03/04 Python
在python下实现word2vec词向量训练与加载实例
2020/06/09 Python
员工考核管理制度
2014/02/02 职场文书
个园导游词
2015/02/04 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js
springboot集成flyway自动创表的详细配置
2021/06/26 Java/Android