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实现定时播放mp3
Mar 29 Python
利用python画一颗心的方法示例
Jan 31 Python
详解Python中的静态方法与类成员方法
Feb 28 Python
python与sqlite3实现解密chrome cookie实例代码
Jan 20 Python
解决pycharm工程启动卡住没反应的问题
Jan 19 Python
在python下使用tensorflow判断是否存在文件夹的实例
Jun 10 Python
通过PHP与Python代码对比的语法差异详解
Jul 10 Python
使用 Django Highcharts 实现数据可视化过程解析
Jul 31 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
Oct 14 Python
wxPython色环电阻计算器
Nov 18 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
Dec 14 Python
Python OpenCV之常用滤波器使用详解
Apr 07 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
解析thinkphp基本配置 convention.php
2013/06/18 PHP
PHP模块化安装教程
2016/06/01 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
2007/05/08 Javascript
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
jquery.validate分组验证代码
2011/03/17 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
JavaScript中的继承方式详解
2015/02/11 Javascript
教你使用javascript简单写一个页面模板引擎
2015/05/05 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
2020/04/11 Javascript
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
详解python中的 is 操作符
2017/12/26 Python
Python使用pickle模块实现序列化功能示例
2018/07/13 Python
Python中捕获键盘的方式详解
2019/03/28 Python
python assert的用处示例详解
2019/04/01 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
python实现各种插值法(数值分析)
2019/07/30 Python
Python程序暂停的正常处理方法
2019/11/07 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
python爬取代理ip的示例
2020/12/18 Python
结合CSS3的布局新特征谈谈常见布局方法
2016/01/22 HTML / CSS
写给女朋友的道歉信
2014/01/12 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
英语辞职信怎么写
2015/02/28 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
结婚堵门保证书
2015/05/08 职场文书
学生犯错保证书
2015/05/09 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript