Python命令行解析器argparse的使用

本文首发于我的个人博客 Suixin's Blog

argparse是Python内置的一个用于命令项选项与参数解析的模块,在编写脚本的过程中是非常常用的。
在其使用中主要包含三个步骤:

import argparse


parser = argparse.ArgumentParser(description='this is a process for read file')
parser.add_argument('fileinPath', help='path to input file')
parser.add_argument('fileoutPath', help='path to output file')
args = parser.parse_args()

而当如上定义后,即可在需要用到参数的地方调用args.fileinPathargs.fileoutPath。下面详细讲解一下add_argument()方法。

add_argument()方法

位置参数

位置参数是必选参数,如果命令行解析不到就会报错,上面例子中两个参数都是位置参数。

可选参数

可选参数可以填写两种,长的可选参数以及短的,并且可以并存,会首先解析长可选参数。如:

parser.add_argument('-s', '--square', help='display a square of a given number', type=int)

当然在一个脚本中,位置参数与可选参数是可以并存的。

一个例子

给一个整数序列,输出它们的和或最大值(默认)

import argparse


parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum the integers (default: find the max)')
args = parser.parse_args()

print(args.accumulate(args.integers))

则在调用的时候:

>>> python test.py
usage: test.py [-h] [--sum] N [N ...]
test.py: error: the following arguments are required: N
>>> python test.py -h
usage: test.py [-h] [--sum] N [N ...]

Process some integers.

positional arguments:
  N           an integer for the accumulator

optional arguments:
  -h, --help  show this help message and exit
  --sum       sum the integers (default: find the max)
>>> python test.py 1 2 3 4
4
>>> python test.py 1 2 3 4 --sum
10

所有参数

  • name or flags - 选项字符串的名字或者列表,例如foo或者-f--foo
  • action - 命令行遇到参数时的动作,默认值是store
    • store_const,表示赋值为const。意思为如果能解析到该参数,则该参数赋值为const的值,见上个例子;

    • store_truestore_false,参数默认值分别为FalseTrue。意思为如果能解析到该参数,则参数值分别改为TrueFalse

    • append,将遇到的值存储成list,也就是如果参数重复则会保存多个值。如:

      >>> import argparse
      >>> parser = argparse.ArgumentParser()
      >>> parser.add_argument('--foo', action='append', type=int)
      >>> parser.parse_args('--foo 1 --foo 2'.split())
      Namespace(foo = [1, 2])
      
    • append_const,将固定值保存成一个list。意思为如果能解析道该参数,则list将会append一个const进来。如:

      import argparse
      
      parser = argparse.ArgumentParser()
      parser.add_argument('--str', dest='types', action='append_const', const=str)
      parser.add_argument('--int', dest='types', action='append_const', const=int)
      args = parser.parse_args()
      
      print(args)
      

      在命令行:

      >>> python test.py --str --str --int
      Namespace(types=[<class 'str'>, <class 'str'>, <class 'int'>])
      
    • count,存储遇到的参数次数。

  • nrgs - 应该读取的命令行参数个数,可以是具体的数字、*+?*表示0个或多个;+表示1个或多个;?时,若解析不到参数,则使用default值,对于可选参数,若只写了参数名而后面没有值,则使用const值。如
    >>> parser = argparse.ArgumentParser()
    >>> parser.add_argument('--foo', nargs='?', const='c', default='d')
    >>> parser.add_argument('bar', nargs='?', default='d')
    >>> parser.parse_args(['XX', '--foo', 'YY'])
    Namespace(bar='XX', foo='YY')
    >>> parser.parse_args(['XX', '--foo'])
    Namespace(bar='XX', foo='c')
    >>> parser.parse_args([])
    Namespace(bar='d', foo='d')
    
    注:nargs=1会将参数存放为list,不同于不设置;对参数加nargs='*'nargs='+'在一定程度可以代替action='append'
  • const - actionnargs所需要的常量值;
  • default - 不指定参数时的默认值;
  • type - 命令行参数应该被转换成的类型;
  • choices - 参数可允许的值的一个容器。可以是listrange
  • required - 可选参数是否可以省略 (仅针对可选参数)。如果设置required='True',则可选参数解析不到时报错;
  • metavar - 在 usage 说明中的参数名称,对于位置参数默认就是参数名称,对于可选参数默认是全大写的参数名称;
  • dest - 解析后的参数名称,默认情况下,对于可选参数选取最长的名称,中划线转换为下划线。

参考

http://wiki.jikexueyuan.com/project/explore-python/Standard-Modules/argparse.html
https://docs.python.org/3/library/argparse.html#the-add-argument-method

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容