Python中的getopt函数使用详解
admin
2023-07-31 02:25:14
0

函数原型:

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\’]

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...