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开发之str.format()用法实例分析
Feb 22 Python
新手如何快速入门Python(菜鸟必看篇)
Jun 10 Python
关于Python数据结构中字典的心得
Dec 04 Python
django+echart绘制曲线图的方法示例
Nov 26 Python
Linux 修改Python命令的方法示例
Dec 03 Python
Python+threading模块对单个接口进行并发测试
Jun 25 Python
python实现简单日志记录库glog的使用
Dec 13 Python
pyinstaller还原python代码过程图解
Jan 08 Python
使用pandas库对csv文件进行筛选保存
May 25 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
Sep 17 Python
Django websocket原理及功能实现代码
Nov 14 Python
用python删除文件夹中的重复图片(图片去重)
May 12 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
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
2006/10/09 PHP
SMARTY学习手记
2007/01/04 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
阻止子元素继承父元素事件具体思路及实现
2013/05/02 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
[01:52]2020年DOTA2 TI10夏季活动预告片
2020/07/15 DOTA
Python函数返回值实例分析
2015/06/08 Python
Python类属性的延迟计算
2016/10/22 Python
Python之列表实现栈的工作功能
2019/01/28 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
Django如何使用jwt获取用户信息
2020/04/21 Python
Python参数传递机制传值和传引用原理详解
2020/05/22 Python
python属于软件吗
2020/06/18 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
如何利用input事件来监听移动端的输入
2016/04/15 HTML / CSS
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
JAVA代码查错题
2014/10/10 面试题
党员个人思想汇报
2013/12/28 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript