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实现将英文单词表示的数字转换成阿拉伯数字的方法
Jul 02 Python
python实现mysql的单引号字符串过滤方法
Nov 14 Python
浅析AST抽象语法树及Python代码实现
Jun 06 Python
深入理解Python装饰器
Jul 27 Python
基于Django模板中的数字自增(详解)
Sep 05 Python
python3中zip()函数使用详解
Jun 29 Python
python多线程与多进程及其区别详解
Aug 08 Python
Python代码块及缓存机制原理详解
Dec 13 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 Python
keras之权重初始化方式
May 21 Python
python用字节处理文件实例讲解
Apr 13 Python
python 如何执行控制台命令与操作剪切板
May 20 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
改进的IP计数器
2006/10/09 PHP
文件上传程序的全部源码
2006/10/09 PHP
php 高性能书写
2010/12/11 PHP
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
用js重建星际争霸
2006/12/22 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
javascript滚轮控制模拟滚动条
2016/10/19 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
解决layui下拉框监听问题(监听不到值的变化)
2019/09/28 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
2019/05/13 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
2021/02/20 Python
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
大学生饮食连锁店创业计划书
2014/01/17 职场文书
工作表现评语
2014/01/19 职场文书
中文教师求职信
2014/02/22 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
令人印象深刻的自荐信
2014/05/25 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
MySQL系列之六 用户与授权
2021/07/02 MySQL
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis