python getopt详解及简单实例


Posted in Python onDecember 30, 2016

 python getopt详解

函数原型:

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 17 Python
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 Python
MySQL中表的复制以及大型数据表的备份教程
Nov 25 Python
Python面向对象编程基础解析(二)
Oct 26 Python
python-docx修改已存在的Word文档的表格的字体格式方法
May 08 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
Feb 07 Python
Django 数据库同步操作技巧详解
Jul 19 Python
TensorFlow内存管理bfc算法实例
Feb 03 Python
对python中各个response的使用说明
Mar 28 Python
jupyter notebook实现显示行号
Apr 13 Python
深入理解Python变量的数据类型和存储
Feb 01 Python
python中os.path.join()函数实例用法
May 26 Python
浅谈编码,解码,乱码的问题
Dec 30 #Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 #Python
python脚本实现数据导出excel格式的简单方法(推荐)
Dec 30 #Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 #Python
python实现按任意键继续执行程序
Dec 30 #Python
详解python3实现的web端json通信协议
Dec 29 #Python
Python正则表达式如何进行字符串替换实例
Dec 28 #Python
You might like
php在window iis的莫名问题的测试方法
2013/05/14 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
javascript学习之闭包分析
2010/12/02 Javascript
javascript 运算数的求值顺序
2011/08/23 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
微信小程序-getUserInfo回调的实例详解
2017/10/27 Javascript
nodejs实现聊天机器人功能
2019/09/19 NodeJs
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
python实现socket端口重定向示例
2014/02/10 Python
Python中使用item()方法遍历字典的例子
2014/08/26 Python
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
Python实现FLV视频拼接功能
2020/01/21 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
基于Python绘制个人足迹地图
2020/06/01 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
原生 JS+CSS+HTML 实现时序图的方法
2019/07/31 HTML / CSS
西班牙第一的网上药房:PromoFarma.com
2017/04/17 全球购物
乌克兰电子产品和家用电器购物网站:TOUCH
2019/08/09 全球购物
幼儿园父亲节活动方案
2014/03/11 职场文书
产品开发计划书
2014/04/27 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
手残删除python之后的补救方法
2021/06/26 Python
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android