Python中的getopt函数使用详解


Posted in Python onJuly 28, 2015

函数原型:

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抓取网页中的图片示例
Feb 28 Python
python调用java的Webservice示例
Mar 10 Python
Django中几种重定向方法
Apr 28 Python
深入解析Python中的变量和赋值运算符
Oct 12 Python
使用Scrapy爬取动态数据
Oct 21 Python
详解python中sort排序使用
Mar 23 Python
Python实现个人微信号自动监控告警的示例
Jul 03 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
Jul 31 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
Python sql注入 过滤字符串的非法字符实例
Apr 03 Python
Scrapy爬虫文件批量运行的实现
Sep 30 Python
django学习之ajax post传参的2种格式实例
May 14 Python
Python3访问并下载网页内容的方法
Jul 28 #Python
python3抓取中文网页的方法
Jul 28 #Python
python列表操作之extend和append的区别实例分析
Jul 28 #Python
python创建列表并给列表赋初始值的方法
Jul 28 #Python
python更新列表的方法
Jul 28 #Python
python实现给数组按片赋值的方法
Jul 28 #Python
python通过加号运算符操作列表的方法
Jul 28 #Python
You might like
php天翼开放平台短信发送接口实现方法
2014/12/22 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
2018/11/10 PHP
总结PHP中初始化空数组的最佳方法
2019/02/13 PHP
js判断输入是否为数字的具体实例
2013/08/03 Javascript
理解和运用JavaScript的闭包机制
2015/08/13 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
微信小程序云开发(数据库)详解
2019/05/17 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
python的urllib模块显示下载进度示例
2014/01/17 Python
Python实现把xml或xsl转换为html格式
2015/04/08 Python
python 分离文件名和路径以及分离文件名和后缀的方法
2018/10/21 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
python实现实时视频流播放代码实例
2020/01/11 Python
vscode写python时的代码错误提醒和自动格式化的方法
2020/05/07 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
纯CSS3制作漂亮带动画效果的主机价格表
2015/04/25 HTML / CSS
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
四风问题自查报告剖析材料
2014/02/08 职场文书
节水口号标语
2014/06/19 职场文书
卢旺达饭店观后感
2015/06/05 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
小学班主任培训心得体会
2016/01/07 职场文书
话题作文之成长
2019/12/09 职场文书
Vue+Flask实现图片传输功能
2022/04/01 Vue.js