Python中optparse模块使用浅析


Posted in Python onJanuary 01, 2015

最近遇到一个问题,是指定参数来运行某个特定的进程,这很类似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中optparse模块使用浅析

Python 相关文章推荐
python爬虫实现教程转换成 PDF 电子书
Feb 19 Python
Python实现连接postgresql数据库的方法分析
Dec 27 Python
Python 错误和异常代码详解
Jan 29 Python
python破解zip加密文件的方法
May 31 Python
使用Python来开发微信功能
Jun 13 Python
解决Python一行输出不显示的问题
Dec 03 Python
使用PyQt4 设置TextEdit背景的方法
Jun 14 Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 Python
基于pandas向csv添加新的行和列
May 25 Python
Python 调用C++封装的进一步探索交流
Mar 04 Python
Python中urllib2模块的8个使用细节分享
Jan 01 #Python
Python读取ini文件、操作mysql、发送邮件实例
Jan 01 #Python
Python实现检测服务器是否可以ping通的2种方法
Jan 01 #Python
Python Web框架Flask信号机制(signals)介绍
Jan 01 #Python
Python模拟登录12306的方法
Dec 30 #Python
python执行shell获取硬件参数写入mysql的方法
Dec 29 #Python
简单的抓取淘宝图片的Python爬虫
Dec 25 #Python
You might like
PHP源代码数组统计count分析
2011/08/02 PHP
linux下php上传文件注意事项
2016/06/11 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
PHP用FTP类上传文件视频等的简单实现方法
2016/09/23 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
jQuery+Pdo编写login登陆界面
2016/08/01 Javascript
JS触发服务器控件的单击事件(详解)
2016/08/06 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
解决vue-cli创建项目的loader问题
2018/03/13 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
Vue程序化的事件监听器(实例方案详解)
2020/01/07 Javascript
在Webpack中用url-loader处理图片和字体的问题
2020/04/28 Javascript
[03:21]【TI9纪实】Old Boys
2019/08/23 DOTA
python中map、any、all函数用法分析
2015/04/21 Python
详解python中的hashlib模块的使用
2019/04/22 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
应聘医药代表职位求职信
2013/10/21 职场文书
大学生的应聘自我评价
2013/12/13 职场文书
《海伦?凯勒》教学反思
2014/04/17 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
三八活动策划方案
2014/08/17 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
张丽莉观后感
2015/06/16 职场文书