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实现超简单端口转发的方法
Mar 13 Python
用Python写一段用户登录的程序代码
Apr 22 Python
Django实现表单验证
Sep 08 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
Aug 21 Python
python类的实例化问题解决
Aug 31 Python
python如何实现单链表的反转
Feb 10 Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 Python
tensorflow指定CPU与GPU运算的方法实现
Apr 21 Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 Python
Python 连接 MySQL 的几种方法
Sep 09 Python
通过案例解析python鸭子类型相关原理
Oct 10 Python
python scipy 稀疏矩阵的使用说明
May 26 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与XML联手进行网站编程代码实例
2008/07/10 PHP
PHP 多进程 解决难题
2009/06/22 PHP
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
smarty内部日期函数html_select_date()用法实例分析
2015/07/08 PHP
php可变长参数处理函数详解
2017/02/22 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
javaScript arguments 对象使用介绍
2013/10/18 Javascript
JS实现弹性漂浮效果的广告代码
2015/09/02 Javascript
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
2016/03/01 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
Webpack打包css后z-index被重新计算的解决方法
2017/06/18 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
Angular通过指令动态添加组件问题
2018/07/09 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
2016/06/23 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
python selenium xpath定位操作
2020/09/01 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
四风问题对照检查材料整改措施
2014/09/27 职场文书
幼儿园门卫安全责任书
2015/05/08 职场文书
班主任远程培训研修日志
2015/11/13 职场文书
大学学生会竞选稿
2015/11/19 职场文书
Redis如何一键部署脚本
2021/04/12 Redis
mysql脏页是什么
2021/07/26 MySQL
Python函数对象与闭包函数
2022/04/13 Python
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android