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中PDB模块中的命令来调试Python代码的教程
Mar 30 Python
python中Genarator函数用法分析
Apr 08 Python
Python类属性与实例属性用法分析
May 09 Python
Fiddler如何抓取手机APP数据包
Jan 22 Python
python之Socket网络编程详解
Sep 29 Python
Python中Scrapy爬虫图片处理详解
Nov 29 Python
python 矩阵增加一行或一列的实例
Apr 04 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
python系列 文件操作的代码
Oct 06 Python
如何分离django中的媒体、静态文件和网页
Nov 12 Python
python实现PCA降维的示例详解
Feb 24 Python
执行Python程序时模块报错问题
Mar 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+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
Javascript valueOf 使用方法
2008/12/28 Javascript
JavaScript 通过模式匹配实现重载
2010/08/12 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
2015/08/10 Javascript
AngularJs bootstrap详解及示例代码
2016/09/01 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
利用JS制作万年历的方法
2017/08/16 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
[01:33]DOTA2上海特级锦标赛 LIQUID战队完整宣传片
2016/03/16 DOTA
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
Tensorflow简单验证码识别应用
2017/05/25 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
Python解决线性代数问题之矩阵的初等变换方法
2018/12/12 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
Django时区详解
2019/07/24 Python
python两个_多个字典合并相加的实例代码
2019/12/26 Python
python读取图片的几种方式及图像宽和高的存储顺序
2020/02/11 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
2021/01/09 Python
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
学习雷锋标语
2014/06/25 职场文书
幼儿园见习报告
2014/10/30 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
企业党员岗位承诺书
2015/04/27 职场文书
Django操作cookie的实现
2021/05/26 Python
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python
Python中可变和不可变对象的深入讲解
2021/08/02 Python
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python