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 cookielib 登录人人网的实现代码
Dec 19 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
Python删除空文件和空文件夹的方法
Jul 14 Python
利用numpy实现一、二维数组的拼接简单代码示例
Dec 15 Python
浅谈python连续赋值可能引发的错误
Nov 10 Python
对Pandas MultiIndex(多重索引)详解
Nov 16 Python
最小二乘法及其python实现详解
Feb 24 Python
Pytest单元测试框架如何实现参数化
Sep 05 Python
PyTorch dropout设置训练和测试模式的实现
May 27 Python
Python数据类型最全知识总结
May 31 Python
Python 如何将integer转化为罗马数(3999以内)
Jun 05 Python
详解非极大值抑制算法之Python实现
Jun 28 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
jQuery 源码分析笔记
2011/05/25 PHP
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
js登录弹出层特效
2014/03/07 Javascript
javascript实现表格排序 编辑 拖拽 缩放
2015/01/02 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
JS原型、原型链深入理解
2016/02/27 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
python读写LMDB文件的方法
2018/07/02 Python
python 缺失值处理的方法(Imputation)
2019/07/02 Python
h5封装下拉刷新
2020/08/25 HTML / CSS
甲方资料员岗位职责
2013/12/13 职场文书
主题教育活动总结
2014/05/05 职场文书
城管大队整治方案
2014/05/06 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
支部鉴定材料
2014/06/02 职场文书
篮球比赛口号
2014/06/10 职场文书
2014年精神文明工作总结
2014/12/23 职场文书
幼儿园园务工作总结2015
2015/05/18 职场文书
居委会工作总结2015
2015/05/18 职场文书
寒假致家长的一封信
2015/10/10 职场文书
考研经验交流会策划书
2015/11/02 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
浅谈克隆 JavaScript
2021/11/02 Javascript