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 time模块用法实例详解
Sep 11 Python
Python实现过滤单个Android程序日志脚本分享
Jan 16 Python
在Python中使用mongoengine操作MongoDB教程
Apr 24 Python
python3中利用filter函数输出小于某个数的所有回文数实例
Nov 24 Python
Python实现直播推流效果
Nov 26 Python
python类中super() 的使用解析
Dec 19 Python
Python图像处理库PIL的ImageFont模块使用介绍
Feb 26 Python
Python龙贝格法求积分实例
Feb 29 Python
Python如何实现定时器功能
May 28 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
Apr 24 Python
Python tensorflow卷积神经Inception V3网络结构
May 06 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
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
jQuery 局部div刷新和全局刷新方法总结
2016/10/05 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
Bootstrap CSS布局之图像
2016/12/17 Javascript
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
使用js和canvas实现时钟效果
2020/09/08 Javascript
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
在Python的Flask框架中使用模版的入门教程
2015/04/20 Python
玩转python爬虫之URLError异常处理
2016/02/17 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
python对绑定事件的鼠标、按键的判断实例
2019/07/17 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
python sleep和wait对比总结
2021/02/03 Python
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
模具设计与制造专业应届生求职信
2013/10/18 职场文书
物流仓储计划书
2014/01/10 职场文书
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
小马王观后感
2015/06/11 职场文书
红色革命电影观后感
2015/06/18 职场文书
合作协议书格式范本
2016/03/21 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书