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对SQLite数据库操作
Apr 06 Python
pycharm运行程序时在Python console窗口中运行的方法
Dec 03 Python
Python判断telnet通不通的实例
Jan 26 Python
python实现集中式的病毒扫描功能详解
Jul 09 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
python3 常见解密加密算法实例分析【base64、MD5等】
Dec 19 Python
Python如何存储数据到json文件
Mar 09 Python
Python如何把十进制数转换成ip地址
May 25 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 Python
Selenium webdriver添加cookie实现过程详解
Aug 12 Python
Python基础之常用库常用方法整理
Apr 30 Python
Python中异常处理用法
Nov 27 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
人族 TERRAN 概述
2020/03/14 星际争霸
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
div层的移动及性能优化
2010/11/16 Javascript
js 窗口抖动示例
2013/09/04 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
jQuery实现的多级下拉菜单效果代码
2015/08/24 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
2015/12/28 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
webpack学习笔记之优化缓存、合并、懒加载
2017/08/24 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
layer 刷新某个页面的实现方法
2019/09/05 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
VSCode 配置uni-app的方法
2020/07/11 Javascript
使用Python生成随机密码的示例分享
2016/02/18 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
python获取代码运行时间的实例代码
2018/06/11 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
Python序列化pickle模块使用详解
2020/03/05 Python
MxNet预训练模型到Pytorch模型的转换方式
2020/05/25 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
贷款担保申请书
2014/05/20 职场文书
青年教师师德演讲稿
2014/08/26 职场文书
优秀校长事迹材料
2014/12/24 职场文书
仓管员岗位职责
2015/02/03 职场文书
九年级历史教学反思
2016/02/19 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书
MySQL锁机制
2021/04/05 MySQL
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏