python zip|python getopt详解与简单实例

更新时间:2020-12-20    来源:python    手机版     字体:

【www.bbyears.com--python】

 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的使用。

函数源码如下:

defParseOptions(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))   exceptgetopt.GetoptError, err:     Usage(docstring)     print"**",str(err),"**"     sys.exit(2)     path_specified=False     foro, ainopts:     ifoin("-h","--help"):       Usage(docstring)       sys.exit()     elifoin("-v","--verbose"):       OPTIONS.verbose=True     elifoin("-p","--path"):       OPTIONS.search_path=a     elifoin("--signapk_path",):       OPTIONS.signapk_path=a     elifoin("--extra_singapk_args",):       OPTIONS.extra_signapk_args=shlex.split(a)     elifoin("--java_path",):       OPTIONS.java_path=a     else:       ifextra_option_handlerisNoneornotextra_option_handler(o, a):       assertFalse,"unknown option \"%s\""%(o,)     os.environ["PATH"]=(os.path.join(OPTIONS.search_path,"bin")+os.pathsep+os.environ["PATH"])     returnargs

其中,extra_option_handler可以理解为函数指针,它的功能也是解析opts的键值对。

extra_option_handler源码如下:

defoption_handler(o, a):  ifoin("-b","--board_config"):   pass # deprecated  elifoin("-k","--package_key"):   OPTIONS.package_key=a  elifoin("-i","--incremental_from"):   OPTIONS.incremental_source=a  elifoin("-w","--wipe_user_data"):   OPTIONS.wipe_user_data=True  elifoin("-n","--no_prereq"):   OPTIONS.omit_prereq=True  elifoin("-e","--extra_script"):   OPTIONS.extra_script=a  elifoin("-a","--aslr_mode"):   ifain("on","On","true","True","yes","Yes"):    OPTIONS.aslr_mode=True   else:    OPTIONS.aslr_mode=False  elifoin("--worker_threads"):   OPTIONS.worker_threads=int(a)  else:   returnFalse  returnTrue

一般生成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"]

本文来源:http://www.bbyears.com/jiaocheng/117543.html

猜你感兴趣