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 08 Python
python使用fileinput模块实现逐行读取文件的方法
Apr 29 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
Python中max函数用于二维列表的实例
Apr 03 Python
对python .txt文件读取及数据处理方法总结
Apr 23 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
Python补齐字符串长度的实例
Nov 15 Python
PyCharm的设置方法和第一个Python程序的建立
Jan 16 Python
Python验证码截取识别代码实例
May 16 Python
python使用多线程查询数据库的实现示例
Aug 17 Python
Python使用pickle进行序列化和反序列化的示例代码
Sep 22 Python
Python生成九宫格图片的示例代码
Apr 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
《APMServ 5.1.2》使用图解
2006/10/23 PHP
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
来自qq的javascript面试题
2010/07/24 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
jQuery插件datalist实现很好看的input下拉列表
2015/07/14 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
JQuery datepicker 用法详解
2015/12/25 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
jquery dataTable 后台加载数据并分页实例代码
2017/06/07 jQuery
Vue.js中的computed工作原理
2018/03/22 Javascript
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
Python中实现两个字典(dict)合并的方法
2014/09/23 Python
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
python检测是文件还是目录的方法
2015/07/03 Python
python利用rsa库做公钥解密的方法教程
2017/12/10 Python
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
德国网上药房:Apotal
2017/04/04 全球购物
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
2014社区三八妇女节活动方案
2014/03/30 职场文书
干部选拔任用方案
2014/05/26 职场文书
法人任命书范本
2014/06/04 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
幼儿园个人师德总结
2015/02/06 职场文书
民事申诉状范本
2015/05/20 职场文书