设为首页 收藏本站
查看: 1330|回复: 0

[经验分享] python小专题——optparse模块

[复制链接]

尚未签到

发表于 2015-4-28 06:30:39 | 显示全部楼层 |阅读模式
  浅谈optparse模块
    最近遇到一个问题,是指定参数来运行某个特定的进程,这很类似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")

>>> 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")

>>> (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")

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

>>> 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")

>>> 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 ][-s ] arg1[,arg2..]"
>>> parser=OptionParser(usage) #这里为类添加了参数usage
>>> optParser.add_option("-f","--file",action = "store",type="string",dest = "fileName",help="no any help")

>>> fakeArgs = ['-f','file.txt']
>>> options, args = parser.parse_args(fakeArgs)
>>> options.fileName
'file.txt'
>>> parser.print_help()
Usage: myprog[ -f ][-s ] 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 ][-s ] arg1[,arg2..]  #这是类的usage信息~~很逼真,有木有?
>>>
  
  上述是介绍基本的语法,下面举两个例子,一个是网上找的一个模拟命令行的参数的例子,另一个是“真实”的例子~~~
    Example1:
  



from optparse import OptionParser
usage = "myprog[ -f ][-s ] 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 ][-s ] 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运行如下:
DSC0000.jpg
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-61300-1-1.html 上篇帖子: python实例26[将log同时写入文件和显示到UI的控件中] 下篇帖子: Python与其他语言结合的参数转换函数PyArg_ParseTuple()
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表