函数原型:
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' ] |
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!