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实现读取目录所有文件的文件名并保存到txt文件代码
Nov 22 Python
Python中字符编码简介、方法及使用建议
Jan 08 Python
Python使用QRCode模块生成二维码实例详解
Jun 14 Python
详解python中executemany和序列的使用方法
Aug 12 Python
Python爬虫包BeautifulSoup实例(三)
Jun 17 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
Jan 04 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
python加载自定义词典实例
Dec 06 Python
Django 再谈一谈json序列化
Mar 16 Python
Python爬虫定时计划任务的几种常见方法(推荐)
Jan 15 Python
python实现马丁策略的实例详解
Jan 15 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
Apr 06 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
东方红 - 来复式再生机的修复
2021/03/02 无线电
PHP XML备份Mysql数据库
2009/05/27 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
使用PHP接受文件并获得其后缀名的方法
2015/08/05 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
web前端开发也需要日志
2010/12/09 Javascript
javascript中的作用域scope介绍
2010/12/28 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
jQuery动画效果图片轮播特效
2016/01/12 Javascript
Backbone.js框架中简单的View视图编写学习笔记
2016/02/14 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
Python学习笔记_数据排序方法
2014/05/22 Python
为Python程序添加图形化界面的教程
2015/04/29 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
Python流程控制 while循环实现解析
2019/09/02 Python
浅谈tensorflow中张量的提取值和赋值
2020/01/19 Python
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
工伤赔偿协议书
2014/04/15 职场文书
青春无悔演讲稿
2014/05/08 职场文书
教师节感谢信
2015/01/22 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
浅谈Node的内存泄露问题
2022/05/06 NodeJs