Python 命令行参数解析库argparse

在工作业务中,有些函数的调用要尽量傻瓜,能够让其他人能够方便地调用,毕竟甲方是爸爸。

假设我有一个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。

本文分享自微信公众号 - MeteoAI(meteoai)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券