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 相关文章推荐
python3使用urllib示例取googletranslate(谷歌翻译)
Jan 23 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 Python
利用Python实现手机短信监控通知的方法
Jul 22 Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
Aug 18 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
python-numpy-指数分布实例详解
Dec 07 Python
Django CSRF认证的几种解决方案
Mar 03 Python
python 已知平行四边形三个点,求第四个点的案例
Apr 12 Python
Python分类测试代码实例汇总
Jul 23 Python
Python读取pdf表格写入excel的方法
Jan 22 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
Laravel 5框架学习之模型、控制器、视图基础流程
2015/04/08 PHP
浅谈PHP中Stream(流)
2015/06/08 PHP
详解PHP序列化反序列化的方法
2015/10/27 PHP
php判断当前操作系统类型
2015/10/28 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
javascript常用的方法分享
2015/07/01 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
2016/02/25 Javascript
基于JavaScript实现智能右键菜单
2016/03/02 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
面包屑导航详解
2017/12/07 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
angularJS自定义directive之带参方法传递详解
2018/10/09 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
2020/08/31 Javascript
基于Python __dict__与dir()的区别详解
2017/10/30 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
Python常见的pandas用法demo示例
2019/03/16 Python
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
双创工作实施方案
2014/03/26 职场文书
大学新生军训方案
2014/05/03 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
医院消毒隔离制度
2015/08/05 职场文书
2016年安全月活动总结
2016/04/06 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript
js前端设计模式优化50%表单校验代码示例
2022/06/21 Javascript