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中字典的setdefault()方法教程
Feb 07 Python
Python搜索引擎实现原理和方法
Nov 27 Python
Python实现矩阵加法和乘法的方法分析
Dec 19 Python
Python 实现引用其他.py文件中的类和类的方法
Apr 29 Python
python 获取当天每个准点时间戳的实例
May 22 Python
Python中实现单例模式的n种方式和原理
Nov 14 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 Python
python elasticsearch环境搭建详解
Sep 02 Python
django 多对多表的创建和插入代码实现
Sep 09 Python
python 在sql语句中使用%s,%d,%f说明
Jun 06 Python
python实现猜拳游戏项目
Nov 30 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 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
第二节 对象模型 [2]
2006/10/09 PHP
PHP保存带BOM文件的方法
2015/02/12 PHP
php动态变量定义及使用
2015/06/10 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
jQuery 性能优化指南(3)
2009/05/21 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
python组合无重复三位数的实例
2018/11/13 Python
python将处理好的图像保存到指定目录下的方法
2019/01/10 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
pytorch 预训练层的使用方法
2019/08/20 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
2019/09/05 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
TheFork葡萄牙:欧洲领先的在线餐厅预订平台
2019/05/27 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
捐赠仪式主持词
2014/03/19 职场文书
道德大讲堂实施方案
2014/05/14 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
就业导师推荐信范文
2015/03/27 职场文书
党支部意见范文
2015/06/02 职场文书
幼儿园心得体会范文
2016/01/21 职场文书