函数原型:
1
|
getopt.getopt(args, shortopts, longopts = [])
|
参数解释:
- args:args为需要解析的参数列表。一般使用sys.argv[1:],这样可以过滤掉第一个参数(ps:第一个参数是脚本的名称,它不应该作为参数进行解析)
- shortopts:简写参数列表
- longopts:长参数列表
返回值:
- opts:分析出的(option, value)列表对。
- args:不属于格式信息的剩余命令行参数列表。
源码分析
在Android生成OTA的build系统中,common.py文件中的ParseOptions函数就是用来解析输入参数的,我们来通过该函数的实现来分析一下getopt的使用。
函数源码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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源码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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如下:
1
2
3
|
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' ]
|
首先,对参数进行分析,其中短参数包括:
1
|
- v, - p, - k,
|
经过解析后,生成的结果如下所示:
1
2
3
4
|
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' ]
|
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!