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编写一个简单的tic-tac-toe游戏的教程
Apr 16 Python
python利用Guetzli批量压缩图片
Mar 23 Python
python中实现k-means聚类算法详解
Nov 11 Python
一篇文章快速了解Python的GIL
Jan 12 Python
pandas object格式转float64格式的方法
Apr 10 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
Jan 17 Python
python web框架 django wsgi原理解析
Aug 20 Python
Windows下python3安装tkinter的问题及解决方法
Jan 06 Python
Python 之 Json序列化嵌套类方式
Feb 27 Python
详解python with 上下文管理器
Sep 02 Python
Python实现定时监测网站运行状态的示例代码
Sep 30 Python
Python之Matplotlib绘制热力图和面积图
Apr 13 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实现根据词频生成tag云的方法
2015/04/17 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
2016/08/01 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
2017/01/08 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
原生JS实现ajax与ajax的跨域请求实例
2017/12/01 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
2019/03/07 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
Python实现二分法算法实例
2015/02/02 Python
python交易记录链的实现过程详解
2019/07/03 Python
python元组的概念知识点
2019/11/19 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
2020/05/07 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
聪明的粉丝购买门票的地方:TickPick
2018/03/09 全球购物
2015年音乐教师个人工作总结
2015/05/20 职场文书
民事调解书范文
2015/05/20 职场文书
务工证明怎么写
2015/06/18 职场文书
Java中的随机数Random
2022/03/17 Java/Android
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis
详解Python内置模块Collections
2022/03/22 Python
Github 使用python对copilot做些简单使用测试
2022/04/14 Python