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 相关文章推荐
PHP webshell检查工具 python实现代码
Sep 15 Python
详解Python各大聊天系统的屏蔽脏话功能原理
Dec 01 Python
使用Python对Excel进行读写操作
Mar 30 Python
使用Pandas对数据进行筛选和排序的实现
Jul 29 Python
python操作docx写入内容,并控制文本的字体颜色
Feb 13 Python
windows python3安装Jupyter Notebooks教程
Apr 13 Python
keras的backend 设置 tensorflow,theano操作
Jun 30 Python
python将字典内容写入json文件的实例代码
Aug 12 Python
套娃式文件夹如何通过Python批量处理
Aug 23 Python
python如何利用paramiko执行服务器命令
Nov 07 Python
Python基于Webhook实现github自动化部署
Nov 28 Python
Python+DeOldify实现老照片上色功能
Jun 21 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中,文件上传
2006/12/06 PHP
php数组一对一替换实现代码
2012/08/31 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
Javascript 自定义类型方法小结
2010/03/02 Javascript
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
Angular 1.x个人使用的经验小结
2017/07/19 Javascript
深入探究node之Transform
2017/07/20 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
python学习数据结构实例代码
2015/05/11 Python
在Lighttpd服务器中运行Django应用的方法
2015/07/22 Python
浅谈python为什么不需要三目运算符和switch
2016/06/17 Python
基于Python实现对PDF文件的OCR识别
2016/08/05 Python
K-means聚类算法介绍与利用python实现的代码示例
2017/11/13 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
Python常用编译器原理及特点解析
2020/03/23 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
2020/06/10 Python
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
成人大专自我鉴定范文
2013/10/19 职场文书
简历自荐信
2013/12/02 职场文书
乐观大学生的自我评价
2014/01/10 职场文书
企业法人授权委托书
2014/04/03 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
Mysql事务索引知识汇总
2022/03/17 MySQL
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android