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实现PS图像调整之对比度调整功能示例
Jan 26 Python
Python跳出多重循环的方法示例
Jul 03 Python
远程部署工具Fabric详解(支持Python3)
Jul 04 Python
使用python切片实现二维数组复制示例
Nov 26 Python
opencv3/C++ 平面对象识别&透视变换方式
Dec 11 Python
PyCharm下载和安装详细步骤
Dec 17 Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 Python
Python更换pip源方法过程解析
May 19 Python
Python字符串三种格式化输出
Sep 17 Python
python 自动识别并连接串口的实现
Jan 19 Python
解决python存数据库速度太慢的问题
Apr 23 Python
Python字典的基础操作
Nov 01 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的ASP防火墙
2006/10/09 PHP
PHP实现获取图片颜色值的方法
2014/07/11 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
javascript读取xml
2006/11/04 Javascript
js操作label给label赋值及取label的值示例
2013/11/07 Javascript
js/jquery解析json和数组格式的方法详解
2014/01/09 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
js实现简单锁屏功能实例
2015/05/27 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
python hook监听事件详解
2018/10/25 Python
20行python代码实现人脸识别
2019/05/05 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
使用已经得到的keras模型识别自己手写的数字方式
2020/06/29 Python
Room Mate Hotels美国:西班牙酒店品牌
2018/04/10 全球购物
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
Linux文件系统类型
2012/02/15 面试题
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
大学生职业生涯规划书范文
2014/01/14 职场文书
班干部竞选演讲稿
2014/04/24 职场文书
售后客服工作职责
2014/06/16 职场文书
领导班子自我剖析材料
2014/08/16 职场文书