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生成pdf文件的方法
Aug 04 Python
python数据结构之链表的实例讲解
Jul 25 Python
Python实现动态图解析、合成与倒放
Jan 18 Python
python docx 中文字体设置的操作方法
May 08 Python
python的格式化输出(format,%)实例详解
Jun 01 Python
python实现图片中文字分割效果
Jul 22 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
Aug 18 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
Jan 02 Python
tensorflow 限制显存大小的实现
Feb 03 Python
Python+OpenCV图像处理——实现直线检测
Oct 23 Python
python自动计算图像数据集的RGB均值
Jun 18 Python
Python matplotlib可视化之绘制韦恩图
Feb 24 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
PHP中的函数嵌套层数限制分析
2011/06/13 PHP
php的数组与字符串的转换函数整理汇总
2013/07/18 PHP
php编程每天必学之验证码
2016/03/03 PHP
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
详解Vue方法与事件
2017/03/09 Javascript
nodejs入门教程五:连接数据库的方法分析
2017/04/24 NodeJs
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
微信小程序实现留言板功能
2018/11/02 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
nodejs通过钉钉群机器人推送消息的实现代码
2019/05/05 NodeJs
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
[02:28]DOTA2亚洲邀请赛附加赛 RECAP赛事回顾
2015/01/29 DOTA
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
python递归实现快速排序
2018/08/18 Python
python矩阵的转置和逆转实例
2018/12/12 Python
Python3实现计算两个数组的交集算法示例
2019/04/03 Python
python实现名片管理系统项目
2019/04/26 Python
Python中的类与类型示例详解
2019/07/10 Python
python监控nginx端口和进程状态
2019/09/06 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
python和js交互调用的方法
2020/06/23 Python
教师评优事迹材料
2014/01/10 职场文书
校友会欢迎辞
2014/01/13 职场文书
小学生优秀评语
2014/12/29 职场文书
2016大学生社会实践单位评语
2015/12/01 职场文书
Win11怎么启动任务管理器?Win11启动任务管理器的几种方法
2021/11/23 数码科技