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 相关文章推荐
wxPython窗口的继承机制实例分析
Sep 28 Python
自己编程中遇到的Python错误和解决方法汇总整理
Jun 03 Python
python文件特定行插入和替换实例详解
Jul 12 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 Python
django 实现编写控制登录和访问权限控制的中间件方法
Jan 15 Python
Python多线程原理与用法实例剖析
Jan 22 Python
pyqt5 实现在别的窗口弹出进度条
Jun 18 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
Feb 13 Python
为什么是 Python -m
Jun 19 Python
Python 操作SQLite数据库的示例
Oct 16 Python
python输出国际象棋棋盘的实例分享
Nov 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中设置index.php文件为只读的方法
2013/02/06 PHP
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
2016/06/12 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
Node.js 异步异常的处理与domain模块解析
2017/05/10 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
jQuery实现表格的增、删、改操作示例
2019/01/27 jQuery
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
python写日志封装类实例
2015/06/28 Python
你真的了解Python的random模块吗?
2017/12/12 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
python3实现基于用户的协同过滤
2018/05/31 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
通过python实现windows桌面截图代码实例
2020/01/17 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
python+requests接口压力测试500次,查看响应时间的实例
2020/04/30 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
介绍一下Make? 为什么使用make
2016/07/31 面试题
就业推荐表自我鉴定范文
2014/03/21 职场文书
成立公司计划书
2014/05/07 职场文书
公司年底活动方案
2014/08/17 职场文书
放假通知范文
2015/04/14 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL
Java Spring Lifecycle的使用
2022/05/06 Java/Android