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

[经验分享] Python 的命令行参数处理 optparse->argparse

[复制链接]

尚未签到

发表于 2015-12-1 10:39:35 | 显示全部楼层 |阅读模式
  optaprse自2.7版开始弃用:弃用optparse模块,不会进一步开发,将继续开发argparse模块作为替代。
  但是用习惯了optparse,还是很好用的撒。
  optparse使用起来,相比旧的getopt模块,更方便、灵活而且解析命令行选项的库功能强大。
  optparse使用声明样式的命令行解析:你创建一个OptionParser实例,填充选项,并解析命令行。
  optparse允许用户使用在传统GNU / POSIX语法的选项,而且会生成的使用和帮助信息(就是你没有显式的定义-h/--help也可以调用查看)。



1 from optparse import OptionParser
2  3 parser = OptionParser()
4 parser.add_option("-f", "--file", dest="filename",
5                   help="write report to FILE", metavar="FILE")
6 parser.add_option("-q", "--quiet",
7                   action="store_false", dest="verbose", default=True,
8                   help="don't print status messages to stdout")
9
10 (options, args) = parser.parse_args()
  然后options保存一个dict对象,就是一个哈希表。arg就是剩下的参数了

  optparse的option提供两种语法,就是短选项(short options)和长选项(long options)了
  传统的Unix语法是一个连字符("-")后面紧跟一个字母,例如- x或- f。并且传统的Unix语法允许多个选项被合并成一个单一的参数,例如 ps -ef 相当于ps -e -f 。
  GNU项目引入了"--"后面紧跟着一串可以用"-"分割的单词,像 --threads, --input-file-with-fq。
  但是optparse功能强大支持就是,除了传统的option语法支持,还有一些奇葩语法也支持,或者少数派的。


  • 支持以"+"开头紧跟字母单词的(+rgb)
  • 支持以"-"开头但接多个字母的(和上面说的合并不是一回事,-pf)
  • 支持以"-"但是接一个单词的(-file, -in, -out)
  • 支持以"/"接单字母,多字母,单词的(这不就是MS-DOS的option语法吗,嘻嘻, dir /T /S /B /in /file)
  optparse的option和option argument之间的空格必须有,但是能区分的情况下可以使用,-n10和-n 10是一样的
  就是 -f disk和-fdisk(Linux/Unix允许,但optparse不),--file disk和--file=disk(Linux/Unix允许,但optparse不)

  parser = OptionParser() 这就是创建一个OptionParser实例:
  查看一下这个类有的方法:



1 >>> for a in dir(optparse.OptionParser):
2 ...     if not a.startswith("_"):
3 ...         print a
4 ...
5 add_option
6 add_option_group
7 add_options
8 check_values
9 destroy
10 disable_interspersed_args
11 enable_interspersed_args
12 error
13 exit
14 expand_prog_name
15 format_description
16 format_epilog
17 format_help
18 format_option_help
19 get_default_values
20 get_description
21 get_option
22 get_option_group
23 get_prog_name
24 get_usage
25 get_version
26 has_option
27 parse_args
28 print_help
29 print_usage
30 print_version
31 remove_option
32 set_conflict_handler
33 set_default
34 set_defaults
35 set_description
36 set_process_default_values
37 set_usage
38 standard_option_list
  OptionParser也可以指定参数呀,常用的usage等
  usage (default: "%prog [options]") help的时候usage,表明程序的整体结构,不想显示的话,赋值usage=optparse.SUPPRESS_USAGE.
  option_list (default: []) 已弃用,和add_option冗余
  option_class (default: optparse.Option) add_option所使用的类
  version (default: None) 默认是空,版本号不显示,True/False
  conflict_handler (default: "error") 指定如果option有冲突的情况下如何处理
  description (default: None) 在打印help的时候添加在usage后的一点介绍性文字
  formatter (default: a new IndentedHelpFormatter) 打印help的时候的格式,可选IndentedHelpFormatter和TitledHelpFormatter.
  add_help_option (default: True) 自动添加 -h和--help选项prog 默认值是 os.path.basename(sys.argv[0]),自定义usage和version中%prog
  epilog (default: None) 打印help的时候添加在最后(option介绍之后)的一段说明文字

  add_option方法使用
  parser.add_option([short_option_str,long_option_str],attr_option_pair,...)
  short_option_str和long_option_str,至少要有一个,可以有多个
  attr_option_pair就是一组键值对attr=value, 有几个常用的,


  • action   读取对应option的value后怎么处理
  • dest      用哪个key引用(dict)或者理解为存到哪个变量中
  • nargs    表示该option有几个值,默认是1,则对饮的dest存的就是tuple
  • type      读取值得类型
  • choices  给定该option的值得选择范围
  • metavar 指定,option value的占位符
  • default   默认值
  • help       解释信息
  • ...
  典型的:parser.add_option("-f", "--file", action="store", type="string", dest="name")
  action指定在命令行参数中遇到一个选项(option)的时候应该怎么处理,默认的是store,就是将下一个参数在类型正确的情况下存到dest指定的中
  action的值有以下这些:


  • store 默认的
  • store_const 存为常量,必须指定const
  • append 追加到一个列表
  • append_const 加为常量,必须指定const
  • count就是自加"++",每有一个加一次
  • callback调用一个函数处理
  • store_true 真值 对应True
  • store_false 假值 对应False
  • help 打印usage信息以及所有option的信息,以及注释信息
  如store_const





parser.add_option("-q", "--quiet",action="store_const", const=0, dest="verbose")
parser.add_option("-v", "--verbose",action="store_const", const=1, dest="verbose")
parser.add_option("--noisy",action="store_const", const=2, dest="verbose")

  type表示值的类型限定:


  • string 接受为字符串类型 默认的
  • int 识别为整型
  • float 浮点型数字
  metavar表示值得占位符


  • 举个例子,打印help的时候,一般 -f FILE, --file FILE 中的FILE就是这个变量指定的
  • 默认是把dest指定的内容,变成大写然后做占位符
  dest 表示要保存读取的值到哪里


  • 默认没有指定的话,是长选项(long option name)一致的,如果长的也没有,就用短选项的,反正长短总得有
  default 设置默认值


  • 就是即使没有指定这个Option或者它的值,dest指定的变量也会有值
  • 更直接的办法是用set_defaults()方法
  help 是解释信息,解释你这个option是什么作用,注意事项是什么。


  • help可以使用%default来引用default指定的值 [2.4版开始]
  • 若default没有指定,则引用%default的值为None
  Note:
  1. 处理布尔型,开关型的参数option,action指定为store_true或者store_false, default则指定默认是True还是False. 例如常用的-v,--verbose; -q,--quiet

   OptionGroup
  当然如果option有类别之分,最好将其分组,每个组表示相对功能比较统一的一组,也就涉及到分组问题,optparse是有的啦。
  我是在看cufflinks的代码的时候,是用Python写的,发现这个的,然后才阅读optparse的documentation了解的。
  其实就是:


  • 将OptionParser实例parser传给OptionGroup,创建OptionGroup实例,如命名为group_dgr
  • 在所创建的实例group_dgr中添加选项条目,用group_dgr.add_option("","","",...)。
  • 将group_dgr添加到parser(OptionParser的实例)
  • 重复1-3,指导所添加的组都添加完成。
  


  • group_dgr = OptionGroup(parser,"Group Name","Group Description")
  • group_dgr.add_option("-g","--group",action="store_true",help="",dest='',default=False)
  • add more options if avialable
  • parser.add_option_group(group_dgr)
  注意:
  1. OptionParser中有一个getter方法()是get_option_group(),就是输入option,输出option所在的OptionGroup
  2. 最后添加完了之后要用parser.parse_args() 来解析,输入2个元素列表,第一个元素是个dict,第二个是list。

  注意到OptionParser有很多的getter和setter可供使用
  19 get_default_values
20 get_description
21 get_option
22 get_option_group
23 get_prog_name
24 get_usage  
25 get_version

28 print_help
29 print_usage

30 print_version
  对应的还有
  32 set_conflict_handler
33 set_default
34 set_defaults
35 set_description
36 set_process_default_values
37 set_usage 可以不作为OptionParser的参数给定,然后通过此方法设置
38 standard_option_list
  

  最后,还有错误处理,还有就打印个help需要这么麻烦吗。

运维网声明 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-145772-1-1.html 上篇帖子: 记录一下自己用到的python logging 下篇帖子: VisualStudio2013下安装Python Flask/jade
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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