Python 命令行参数工具 argparse

Python 在写命令行脚本的时候,最直接的获取参数的方法是使用 sys.argv()html

但若是参数较多较复杂,且脚本会长期使用,或给别人使用。那么提供一套完整友好的命令行参数接口就比较可取了。python

argparse 包是标准包,提供参数解析、校验、默认值、提示、帮助等一系列功能。命令行

假设需求为一个以日期为参数的脚本,它容许参数为:code

  • 空,此时默认取昨天
  • '%Y-%m-%d' 格式的字符串,处理这个日期
  • '%Y-%m-%d:%Y-%m-%d' 格式的字符串,处理日期区间

例:orm

if __name__ == '__main__':
    yesterday = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime(DT_FORMAT)
    parser = argparse.ArgumentParser()
    parser.add_argument('date', nargs='?', default=yesterday, help='date, like "2016-08-18"')
    parser.add_argument('-r', '--range', help='date range, like "2016-08-18:2016-08-20"')
    args = parser.parse_args()
    if args.range:
        try:
            start, end = args.range.split(':')
            start_date = datetime.datetime.strptime(start, DT_FORMAT)
            end_date = datetime.datetime.strptime(end, DT_FORMAT)
        except ValueError as e:
            print(u'-r 参数错误:\n\t {}'.format(e))
            parser.print_help()
        else:
            date = start_date
            while date <= end_date:
                main(date)
                date += datetime.timedelta(days=1)
    else:
        date = datetime.datetime.strptime(args.date, DT_FORMAT)
        main(date)

基本思路就是:htm

  1. 实例化一个 argparse.ArgumentParser 对象
  2. 经过 add_argument() 添加一系列参数规则
  3. 调用 parse_args() 获得参数,或打印异常信息

重点在于 add_argument() 的各类参数用法:对象

  • 第一位置参数为字符串参数名,前面不加任何前缀表示位置参数(如 date),加两个短横线表示可选命名参数(如 --verbose),加一个短横线表示可选命名参数的缩写版(如-v)。
  • 那么问题来了,假如我想使用可选位置参数怎么办,好比上例的日期,我想他默认是昨天,所以能够不填,那么就要使用 nargs 参数,它指明参数数量,能够是 1,0 或者 ? 表示不定。
  • 那么问题又来了,像 --verbose 这种参数,正经常使用法都是后面什么都不接的,给出这个参数名就表明 true,不写就表明 false,该怎么处理呢。答案就是 action 参数,它表明当用户给出本参数名时应该采起的操做。以 --verbose 为例,能够设为 action='store_true',这样无论用户的 --vrebose 后面跟什么,跟不跟,args.verbose 的值都是 True。不然当用户只写了可选命名参数的参数名,却没写值的时候,ArgumentParser 的默认作法是返回一个 None

详参:接口

Tutorial字符串

Referenceget

相关文章
相关标签/搜索