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 正则式 概述及常用字符
May 07 Python
Win10下Python环境搭建与配置教程
Nov 18 Python
ubuntu系统下 python链接mysql数据库的方法
Jan 09 Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
关于python写入文件自动换行的问题
Jun 23 Python
Python爬虫框架scrapy实现的文件下载功能示例
Aug 04 Python
Django项目中实现使用qq第三方登录功能
Aug 13 Python
python 解决flask 图片在线浏览或者直接下载的问题
Jan 09 Python
Python判断三段线能否构成三角形的代码
Apr 12 Python
python工具——Mimesis的简单使用教程
Jan 16 Python
Python中time与datetime模块使用方法详解
Mar 31 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中的foreach问题
2013/06/30 PHP
简单的php缓存类分享     php缓存机制
2014/01/22 PHP
PHP实现截取中文字符串不出现?号的解决方法
2016/12/29 PHP
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
关于Vue.js一些问题和思考学习笔记(1)
2016/12/02 Javascript
js 转义字符及URI编码详解
2017/02/28 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
对layui中表单元素的使用详解
2018/08/15 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
详解python中init方法和随机数方法
2019/03/13 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
简单了解python高阶函数map/reduce
2019/06/28 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
django 模版关闭转义方式
2020/05/14 Python
keras slice layer 层实现方式
2020/06/11 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
歌颂祖国的演讲稿
2014/05/04 职场文书
要账委托书范本
2014/09/15 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书
Redis如何实现分布式锁
2021/08/23 Redis
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android
Python中的socket网络模块介绍
2022/07/23 Python