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中的socket模块使用代理实例
May 29 Python
python简单实现旋转图片的方法
May 30 Python
python如何通过实例方法名字调用方法
Mar 21 Python
基于python实现学生管理系统
Oct 17 Python
python中时间、日期、时间戳的转换的实现方法
Jul 06 Python
Python中调用其他程序的方式详解
Aug 06 Python
python 公共方法汇总解析
Sep 16 Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 Python
如何利用Python动态模拟太阳系运转
Sep 04 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
Nov 05 Python
python FTP编程基础入门
Feb 27 Python
教你用Python+selenium搭建自动化测试环境
Jun 18 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版(3)
2006/10/09 PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
关于php fread()使用技巧
2010/01/22 PHP
基于PHP编程注意事项的小结
2013/04/27 PHP
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
JS应用之禁止抓屏、复制、打印
2008/02/21 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
JavaScript入门教程之引用类型
2016/05/04 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
利用Vue.js指令实现全选功能
2016/09/08 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python实现代理服务功能实例
2013/11/15 Python
Python脚本实现代码行数统计代码分享
2015/03/10 Python
Python判断字符串与大小写转换
2015/06/08 Python
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
Python实现类的创建与使用方法示例
2017/07/25 Python
python 经典数字滤波实例
2019/12/16 Python
Hotels.com印度:酒店预订
2019/05/11 全球购物
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
书香家庭事迹材料
2014/05/09 职场文书
暑期培训班招生方案
2014/08/26 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
工作推荐信模板
2015/03/25 职场文书
实习推荐信格式模板
2015/03/27 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
Python可视化学习之seaborn调色盘
2022/02/24 Python