Python中的getopt函数使用详解


Posted in Python onJuly 28, 2015

函数原型:

getopt.getopt(args, shortopts, longopts=[])

参数解释:

  •     args:args为需要解析的参数列表。一般使用sys.argv[1:],这样可以过滤掉第一个参数(ps:第一个参数是脚本的名称,它不应该作为参数进行解析)
  •     shortopts:简写参数列表
  •     longopts:长参数列表

返回值:

  •     opts:分析出的(option, value)列表对。
  •     args:不属于格式信息的剩余命令行参数列表。

源码分析

在Android生成OTA的build系统中,common.py文件中的ParseOptions函数就是用来解析输入参数的,我们来通过该函数的实现来分析一下getopt的使用。

函数源码如下:

def ParseOptions(argv, docstring, extra_opts="", extra_long_opts=(), extra_option_handler=None):
 try:
 opts, args = getopt.getopt(
  argv, "hvp:s:x" + extra_opts,
  ["help", "verbose", "path=", "signapk_path=", "extra_signapk_args=", "java_path=", "public_key_suffix=", "private_key_suffix=", "device_specific=", "extra="] + list(extra_long_opts))
 except getopt.GetoptError, err:
 Usage(docstring)
 print "**", str(err), "**"
 sys.exit(2)

 path_specified = False

 for o, a in opts:
 if o in ("-h", "--help"):
  Usage(docstring)
  sys.exit()
 elif o in ("-v", "--verbose"):
  OPTIONS.verbose = True
 elif o in ("-p", "--path"):
  OPTIONS.search_path = a
 elif o in ("--signapk_path",):
  OPTIONS.signapk_path = a
 elif o in ("--extra_singapk_args",):
  OPTIONS.extra_signapk_args = shlex.split(a)
 elif o in ("--java_path",):
  OPTIONS.java_path = a
 else:
  if extra_option_handler is None or not extra_option_handler(o, a):
  assert False, "unknown option \"%s\"" % (o,)

 os.environ["PATH"] = (os.path.join(OPTIONS.search_path, "bin") + os.pathsep + os.environ["PATH"])

 return args

其中,extra_option_handler可以理解为函数指针,它的功能也是解析opts的键值对。
extra_option_handler源码如下:

 

def option_handler(o, a):
 if o in ("-b", "--board_config"):
 pass # deprecated
 elif o in ("-k", "--package_key"):
 OPTIONS.package_key = a
 elif o in ("-i", "--incremental_from"):
 OPTIONS.incremental_source = a
 elif o in ("-w", "--wipe_user_data"):
 OPTIONS.wipe_user_data = True
 elif o in ("-n", "--no_prereq"):
 OPTIONS.omit_prereq = True
 elif o in ("-e", "--extra_script"):
 OPTIONS.extra_script = a
 elif o in ("-a", "--aslr_mode"):
 if a in ("on", "On", "true", "True", "yes", "Yes"):
 OPTIONS.aslr_mode = True
 else:
 OPTIONS.aslr_mode = False
 elif o in ("--worker_threads"):
 OPTIONS.worker_threads = int(a)
 else:
 return False
 return True

一般生成OAT全量包的参数argv如下:

argv = ['-v', '-p', 'out/host/linux-xxx', '-k', 'build/target/product/security/testkey', 'out/target/product/xxx/obj/PACKAGING/target_files_intermediates/xxx-target_files.zip', 'out/target/product/xxx/xxx_20150723.1340-ota.zip']

首先,对参数进行分析,其中短参数包括:
-v,-p,-k,

经过解析后,生成的结果如下所示:

opts = [('-v', ''), ('-p', 'out/host/linux-x86'), ('-k', 'build/target/product/security/testkey')]

args =['out/target/product/xxx/obj/PACKAGING/target_files_intermediates/xxx-target_files.zip', 'out/target/product/xxx/xxx_20150723.1340-ota.zip']

Python 相关文章推荐
Python中实现字符串类型与字典类型相互转换的方法
Aug 18 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
Apr 09 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 Python
利用python获取某年中每个月的第一天和最后一天
Dec 15 Python
Python中字典和集合学习小结
Jul 07 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
Aug 02 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
详解有关PyCharm安装库失败的问题的解决方法
Feb 02 Python
python自动化unittest yaml使用过程解析
Feb 03 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 Python
详解解Django 多对多表关系的三种创建方式
Aug 23 Python
Python3访问并下载网页内容的方法
Jul 28 #Python
python3抓取中文网页的方法
Jul 28 #Python
python列表操作之extend和append的区别实例分析
Jul 28 #Python
python创建列表并给列表赋初始值的方法
Jul 28 #Python
python更新列表的方法
Jul 28 #Python
python实现给数组按片赋值的方法
Jul 28 #Python
python通过加号运算符操作列表的方法
Jul 28 #Python
You might like
菜鸟学PHP之Smarty入门
2007/01/04 PHP
PHP 金额数字转换成英文
2010/05/06 PHP
PHP实现一维数组与二维数组去重功能示例
2018/05/24 PHP
php 读取文件夹下所有图片、文件的实例
2018/10/17 PHP
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
用POSTMAN发送JSON格式的POST请求示例
2018/09/04 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
Servlet返回的数据js解析2种方法
2019/12/12 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
python中类和实例如何绑定属性与方法示例详解
2017/08/18 Python
在Pycharm中自动添加时间日期作者等信息的方法
2019/01/16 Python
基于keras输出中间层结果的2种实现方式
2020/01/24 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
详解python tkinter 图片插入问题
2020/09/03 Python
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
说出一些常用的类,包,接口
2014/09/22 面试题
军训的自我鉴定
2013/12/10 职场文书
资金主管岗位职责范本
2014/03/04 职场文书
元宵节晚会主持人串词
2014/03/25 职场文书
三项教育活动实施方案
2014/03/30 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
献爱心活动总结
2014/05/07 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
Python实现的扫码工具居然这么好用!
2021/06/07 Python
总结Python使用过程中的bug
2021/06/18 Python