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 相关文章推荐
django实现分页的方法
May 26 Python
Python-OpenCV基本操作方法详解
Apr 02 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
在Python中append以及extend返回None的例子
Jul 20 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
Aug 06 Python
pycharm 安装JPype的教程
Aug 08 Python
Django Admin中增加导出Excel功能过程解析
Sep 04 Python
python3正则模块re的使用方法详解
Feb 11 Python
python实现跨excel sheet复制代码实例
Mar 03 Python
解决python便携版无法直接运行py文件的问题
Sep 01 Python
Django rest framework如何自定义用户表
Jun 09 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
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
smarty模板数学运算示例
2016/12/11 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
IE和Firefox下event事件杂谈
2009/12/18 Javascript
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
2010/04/02 Javascript
js和as的稳定传值问题解决
2013/07/14 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
2014/01/26 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
jQuery动态加载css文件实现方法
2016/06/15 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
Vue2.0 实现单选互斥的方法
2018/04/13 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
Python二维码生成识别实例详解
2019/07/16 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
编写python代码实现简单抽奖器
2020/10/20 Python
html通过canvas转成base64的方法
2019/07/18 HTML / CSS
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
澳大利亚宠物食品和用品商店:PETstock
2020/01/02 全球购物
英语文学专业学生的自我评价
2013/10/31 职场文书
户籍证明的格式
2014/01/13 职场文书
高中军训感想800字
2014/02/23 职场文书
《绿色蝈蝈》教学反思
2014/03/02 职场文书
皇城相府导游词
2015/02/06 职场文书
简单的辞职信怎么写
2015/02/28 职场文书
2016毕业实习单位评语大全
2015/12/01 职场文书
Redis可视化客户端小结
2021/06/10 Redis
室外天线与收音机天线杆接合方法
2022/04/05 无线电
JS实现简单的九宫格抽奖
2022/06/28 Javascript