当前位置:Gxlcms > Python > Python中的getopt函数使用详解

Python中的getopt函数使用详解

时间:2021-07-01 10:21:17 帮助过:65人阅读

函数原型:

  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. def ParseOptions(argv, docstring, extra_opts="", extra_long_opts=(), extra_option_handler=None):
  2. try:
  3. opts, args = getopt.getopt(
  4. argv, "hvp:s:x" + extra_opts,
  5. ["help", "verbose", "path=", "signapk_path=", "extra_signapk_args=", "java_path=", "public_key_suffix=", "private_key_suffix=", "device_specific=", "extra="] + list(extra_long_opts))
  6. except getopt.GetoptError, err:
  7. Usage(docstring)
  8. print "**", str(err), "**"
  9. sys.exit(2)
  10. path_specified = False
  11. for o, a in opts:
  12. if o in ("-h", "--help"):
  13. Usage(docstring)
  14. sys.exit()
  15. elif o in ("-v", "--verbose"):
  16. OPTIONS.verbose = True
  17. elif o in ("-p", "--path"):
  18. OPTIONS.search_path = a
  19. elif o in ("--signapk_path",):
  20. OPTIONS.signapk_path = a
  21. elif o in ("--extra_singapk_args",):
  22. OPTIONS.extra_signapk_args = shlex.split(a)
  23. elif o in ("--java_path",):
  24. OPTIONS.java_path = a
  25. else:
  26. if extra_option_handler is None or not extra_option_handler(o, a):
  27. assert False, "unknown option \"%s\"" % (o,)
  28. os.environ["PATH"] = (os.path.join(OPTIONS.search_path, "bin") + os.pathsep + os.environ["PATH"])
  29. return args

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

  1. def option_handler(o, a):
  2. if o in ("-b", "--board_config"):
  3. pass # deprecated
  4. elif o in ("-k", "--package_key"):
  5. OPTIONS.package_key = a
  6. elif o in ("-i", "--incremental_from"):
  7. OPTIONS.incremental_source = a
  8. elif o in ("-w", "--wipe_user_data"):
  9. OPTIONS.wipe_user_data = True
  10. elif o in ("-n", "--no_prereq"):
  11. OPTIONS.omit_prereq = True
  12. elif o in ("-e", "--extra_script"):
  13. OPTIONS.extra_script = a
  14. elif o in ("-a", "--aslr_mode"):
  15. if a in ("on", "On", "true", "True", "yes", "Yes"):
  16. OPTIONS.aslr_mode = True
  17. else:
  18. OPTIONS.aslr_mode = False
  19. elif o in ("--worker_threads"):
  20. OPTIONS.worker_threads = int(a)
  21. else:
  22. return False
  23. 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']


首先,对参数进行分析,其中短参数包括:

  1. -v,-p,-k,


经过解析后,生成的结果如下所示: