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实现socket客户端和服务端简单示例
Feb 24 Python
Python去掉字符串中空格的方法
Mar 11 Python
零基础写python爬虫之抓取百度贴吧代码分享
Nov 06 Python
在Windows中设置Python环境变量的实例讲解
Apr 28 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
python增加图像对比度的方法
Jul 12 Python
python操作cfg配置文件方式
Dec 22 Python
pycharm激活码有效到2020年11月底
Sep 18 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 Python
python解决12306登录验证码的实现
Apr 18 Python
pytorch查看网络参数显存占用量等操作
May 12 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编程中八种常见的文件操作方式
2006/11/19 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
js实现的简洁网页滑动tab菜单效果代码
2015/08/24 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
jQuery Validate表单验证插件 添加class属性形式的校验
2016/01/18 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
2016/08/09 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
2016/09/14 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
js实现小时钟效果
2020/03/25 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
2020/07/19 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
2020/11/04 Javascript
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
Python的IDEL增加清屏功能实例
2017/06/19 Python
Python简单生成随机数的方法示例
2018/03/31 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
python print出共轭复数的方法详解
2019/06/25 Python
Python:__eq__和__str__函数的使用示例
2020/09/26 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
蔬菜基地的创业计划书
2014/01/06 职场文书
学生宿舍管理制度
2014/01/30 职场文书