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实现设置windows桌面壁纸代码分享
Mar 28 Python
python计算N天之后日期的方法
Mar 31 Python
Python 递归函数详解及实例
Dec 27 Python
Python 确定多项式拟合/回归的阶数实例
Dec 29 Python
python解析含有重复key的json方法
Jan 22 Python
Python列表与元组的异同详解
Jul 02 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
Oct 30 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
Nov 26 Python
python实现引用其他路径包里面的模块
Mar 09 Python
如何完美的建立一个python项目
Oct 09 Python
Python Process创建进程的2种方法详解
Jan 25 Python
Django框架中模型的用法
Jun 10 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版(1)
2006/10/09 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
PHP获取网址的顶级域名函数代码
2012/09/24 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
浅谈node的事件机制
2017/10/09 Javascript
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
微信小程序的mpvue框架快速上手指南
2019/05/15 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
在Python中使用Neo4j数据库的教程
2015/04/16 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
python3 使用ssh隧道连接mysql的操作
2020/12/05 Python
css3 中的新特性加强记忆详解
2016/04/16 HTML / CSS
HTML5是什么 HTML5是什么意思 HTML5简介
2012/10/26 HTML / CSS
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
写好求职信第一句话的技巧
2013/10/26 职场文书
访谈节目策划方案
2014/05/15 职场文书
中考标语大全
2014/06/05 职场文书
中职生求职信
2014/07/01 职场文书
小学家长学校培训材料
2014/08/24 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
2014年法院个人工作总结
2014/12/17 职场文书
质量负责人岗位职责
2015/02/15 职场文书
pytorch MSELoss计算平均的实现方法
2021/05/12 Python