在工作业务中,有些函数的调用要尽量傻瓜,能够让其他人能够方便地调用,毕竟甲方是爸爸。
假设我有一个python程序,姑且叫extract_WRF.py,内部代码如下例子一,脚本中的main主函数功能简化为打印出输入的参数,即:
print(zone,input_source_dir,output_source_dir,features,levels)
参数有zone,input_source_dir,output_source_dir,feature,levels,但是该函数print不能在命令行运行,只能在脚本内部调用,于是我们需要python标准库内的argparse[1]来帮忙。
使用步骤:
1)import argparse 首先导入模块
2)parser = argparse.ArgumentParser() 创建一个解析对象
3)parser.add_argument() 向该对象中添加你要关注的命令行参数和选项
4)parser.parse_args() 进行解析
对于第2步, 通过help parser ,显示其参数有:
- pro --程序名称,默认为 sys.argv[0]
-usage --用法信息,默认从参数自动获取
-description -- 描述项目是做什么的
-epilog --紧随着参数描述(argument)的文本
-formatter_class --自定义帮助信息的格式
-prefix_chars -- 命令行的前缀
- fromfile_prefix_chars -- 额外的参数应该读取的文件的前缀字符集(默认:None)
- argument_default -- 参数的全局默认值(默认:None)
- conflict_handler --解决冲突的可选策略
-add help - 给解析器添加-h/–help 选项(默认: True)
对于第3步,依次增加所需参数,并规定其是否是必须参数、类型、默认值、个数。比如required = True 规定其为必要参数,type=str 定义其为字符串,默认值为‘d02’,帮助信息为’WRF模拟区域d01,d02,d03中的一个‘。
对于 features 参数,我们利用nargs来指定 featuers 参数后面的值有多少个,默认为1,本文例子中定义为*,代表无穷多个,即nargs *来表示如果有该位置参数输入的话,之后所有的输入都将作为该位置参数的值。
例子一:
# 整个脚本名称叫extact_WRF.py
import time import os
import sys import argparse
def parse_arguments(argv):
parser = argparse.ArgumentParser() #
# 添加参数名、默认值,类型
parser.add_argument('--zone',required = True, type=str, default ='d02', help='one of the 3 WRF model zones: d02,d01 OR d03')
parser.add_argument('--input_source_dir', type= str , default='/publi/home/wang/wrf_1/', help='WRF data location')
parser.add_argument('--output_source_dir', type=str, default='/public/home/test_read_stns', help='aim dir which save output')
parser.add_argument('--features', nargs = '*', default=['RH','RA','SW','PBLH','UU','VV','TA','PR'], help='wanted feature name')
parser.add_argument('--levels', nargs = '*', default=[1000,950,900,850,800,750,650] , help='wanted Pressure levels ,units:hPa')
return parser.parse_args(argv)
def main(args): #接收输入参数#打印输入的参数
print(args.zone,
args.input_source_dir,
args.output_source_dir,
args.features,
args.levels)
if __name__ == "__main__":
start = time.time()
main(parse_arguments(sys.argv[1:]))
end = time.time()
print('run time: ', end - start)
print('extract WRF data success! \n')
在命令行输入python extract_WRF --help ,会打印出各个参数的说明:
usage: extract_WRF.py [-h] [--zone ZONE]
[--input_source_dir INPUT_SOURCE_DIR]
[--output_source_dir OUTPUT_SOURCE_DIR]
[--features [FEATURES [FEATURES ...]]]
[--levels [LEVELS [LEVELS ...]]]
optional arguments:
-h, --help show this help message and exit
--zone ZONE one of the 3 WRF model zones: d02,d01 OR d03
--input_source_dir INPUT_SOURCE_DIR
WRF data location
--output_source_dir OUTPUT_SOURCE_DIR
aim dir which save output
--features [FEATURES [FEATURES ...]]
wanted feature name
--levels [LEVELS [LEVELS ...]]
wanted Pressure levels ,units:hPa
如果不使用默认的参数,在命令行输入python extract_WRF.py --zone 'd03' --features 'UU' 'PBLH'
打印出了所输入的新参数,说明输入参数调用成功。
d03 /public/home/wang/wrf_1/ /public/home/test_read_stns_1day ['UU', 'PBLH'] [1000, 950, 900, 850, 800, 750, 650]
run time: 0.0012843608856201172
extract WRF data success!
实际上,python 还有其他的命令行解析库,比如Flask 作者写的click,谷歌开源的fire。