1 argparse命令行参数解析库用法总结

argparse是python内置的命令行参数解析库,如果你的Python程序在运行时需要配置大量的可选参数,那么使用这个库可以很容易进行命令行参数的管理,并根据各种参数做出不同的操作,有利于逻辑分离,增加代码的逻辑性、简洁性、易用性。

该库在很多知名的项目中使用,特别是在深度学习项目中被广泛用于命令行参数解析,在阅读源码时经常可以看到这个库的使用,本文将对该库的一些基础用法进行简单的总结。

1.1 argparse的基本使用

1.1.1 创建解析器

使用argparse的第一步是创建一个ArgumentParser对象

parser=argparse.ArgumentParser(description='Process some integers.')

ArgumentParser对象包含将命令行解析成Python数据类型所需的全部信息。

1.1.2 添加参数

给一个ArgumentParser添加程序参数信息可以通过调用add_argument()方法完成。通常,这些调用指定ArgumentParser如何获取命令行字符串并将其转换为对象。例如

parser.add_argument('integers',metavar='N',type=int,nargs='+',help='an integer for the accumulator')
1.1.3 解析参数

ArgumentParser通过parse_args()方法解析参数。它将检查命令行,把每个参数转换为适当的类型然后调用相应的操作。

parser=argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers',metavar='N',type=int,nargs='+',help='an integer for the accumulator')
args = parser.parse_args()
1.1.4 设置默认参数

在大多数时候,parse_args()所返回对象的属性将完全通过检查命令行参数来确定。set_defaults()则允许加入一些无须任何命令行检查的额外属性

ArgumentParser.set_defaults(**kwargs)

需要注意的是,如果通过set_defaults(**kwargs)设置了默认参数,它会覆盖所设置的命令行参数,也就是说set_defaults(**kwargs)设置的默认参数比在运行程序添加的命令行参数有更高的优先级。

比如

# -*- coding: utf-8 -*-

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="ArgParse Test Demo")
    parser.add_argument('--food', type=str, default='rice', help='food you want to eat')
    args = parser.parse_args()
    print('I want to eat {}'.format(args.food))

    parser.set_defaults(food='beef')
    args = parser.parse_args()
    print('I want to eat {}'.format(args.food))

程序输出

I want to eat rice
I want to eat beef
1.1.5 使用示例

下面一个简单的例子演示argparse的用法,现在假设我想程序输出I want to eat xxx,其中xxx代表一种食物,这个食物的命令通过命令行参数food传递到程序中。假设此python文件名为eat.py,其代码如下

# -*- coding: utf-8 -*-

import argparse

def get_parser():
    parser = argparse.ArgumentParser(description="ArgParse Test Demo")
    parser.add_argument('--food',type=str,default='rice',help='food you want to eat')

    return parser

if __name__ == '__main__':
    args = get_parser().parse_args()

    print('I want to eat {}'.format(args.food))

在命令行中执行一下命令

python eat.py --food fish

程序输出

I want to eat fish

上面的代码段中,我们显示引入了argparse包,然后通过argparse.ArgumentParser函数生成argparse对象,其中这个函数的description函数表示在命令行显示帮助信息的时候,这个程序的描述信息。之后我们通过对象的add_argument函数来增加参数。这里我们只增加了一个--food的参数,然后后面的default参数表示如果没提供参数,我们默认采用的值。即如果像下面这样执行命令:

python eat.py

程序输出

I want to eat rice

最后我们通过argpaser对象的parser_args函数来获取所有参数args,然后通过args.food的方式得到我们设置的--food参数的值,可以看到这里argparse默认的参数名就是--food形式里面--后面的字符串。

在下文将介绍parser.add_argument()中所使用的一些参数,并进行解释。

1.2 parser.add_argument的参数

1.2.1 default参数

default参数表示当命令行中没有设置该参数的时候,则使用默认值。

1.2.2 required参数

required参数表示命令行中这个参数是否是必须要设置的,如果该参数不进行设置,则在程序运行时会出错。

如果设置

parser.add_argument('--food',type=str,required=True)

则表示food是必须要进行设置的。

例如:

# -*- coding: utf-8 -*-

import argparse

def get_parser():
    parser = argparse.ArgumentParser(description="ArgParse Test Demo")
    parser.add_argument('--food',type=str,default='rice',help='food you want to eat',required=True)

    return parser

if __name__ == '__main__':
    args = get_parser().parse_args()

    print('I want to eat {}'.format(args.food))

如果不设置该参数,使用

python eat.py

运行程序,则会出现以下报错

usage: ArgParseTest.py [-h] --food FOOD
eat.py: error: the following arguments are required: --food
1.2.3 type参数

type参数用于表明此命令行参数的数据类型,默认为str类型。

  • 如果需要参数为布尔类型,则设置type = bool
  • 如果需要参数为int类型,则设置type = int
  • 如果需要参数为str类型,则设置type = str
  • 如果需要参数为float类型,则设置type = float

例如

# -*- coding: utf-8 -*-

import argparse

def get_parser():
    parser = argparse.ArgumentParser(description="ArgParse Test Demo")
    parser.add_argument('--food',type=str,default='rice',help='food you want to eat')
    parser.add_argument('--food_num', type=int, default=1, help='food num')

    return parser

if __name__ == '__main__':
    args = get_parser().parse_args()
    print('I want to eat {} {}'.format(args.food_num,args.food))

使用以下命令运行上述代码

python eat.py --food fish --food_num 100

程序输出

I want to eat 100 fish
1.2.4 choices参数

choices参数表明此命令行参数只能从给定的参数列表中进行选取。

# -*- coding: utf-8 -*-

import argparse

def get_parser():
    parser = argparse.ArgumentParser(description="ArgParse Test Demo")
    parser.add_argument('--food',type=str,default='rice',help='food you want to eat',choices=['fish','rice','beef'])

    return parser

if __name__ == '__main__':
    args = get_parser().parse_args()

    print('I want to eat {}'.format(args.food))

上述例子通过对命令行参数food使用choices参数,表明food参数只能从fish、rice、beef三种食物之中进行选取,如果不是从给定的可选参数中选取,则会报错。

比如,使用以下命令行运行上述程序

python eat.py --food tomato

则会出现以下错误信息

usage: ArgParseTest.py [-h] [--food {fish,rice,beef}]
eat.py: error: argument --food: invalid choice: 'tomato' (choose from 'fish', 'rice', 'beef')

在命令行指定的--food参数值为tomato,而这个不在指定的choices范围内,所以会报错。

1.2.5 help参数

help参数比较简单,主要是设置该参数的help信息,如果项目很大,需要设置的参数很多,那么为每一个命令行参数设置help参数是很有必要的,有利于帮助使用者快速的明白各个参数的作用,尽早的的投入项目开发。

例如

# -*- coding: utf-8 -*-

import argparse

def get_parser():
    parser = argparse.ArgumentParser(description="ArgParse Test Demo")
    parser.add_argument('--food',type=str,default='rice',help='food you want to eat')

    return parser

if __name__ == '__main__':
    args = get_parser().parse_args()

    print('I want to eat {}'.format(args.food))

使用以下命令行运行上述代码

python eat.py -h

或者

python eat.py --help

程序输出

usage: eat.py [-h] [--food FOOD]

ArgParse Test Demo

optional arguments:
  -h, --help   show this help message and exit
  --food FOOD  food you want to eat

通过使用-h或者--help可以让程序输出可以使用的命令行参数以及各个参数的具体作用,可以帮助使用用户更好的使用程序。

1.2.6 dest参数

argparse默认的变量名是--或-后面的字符串,但是你也可以通过dest=xxx来设置参数的变量名,然后在代码中用args.xxx来获取参数的值。

例如

# -*- coding: utf-8 -*-

import argparse

def get_parser():
    parser = argparse.ArgumentParser(description="ArgParse Test Demo")
    parser.add_argument('--food',type=str,default='rice',help='food you want to eat',dest='food_name')

    return parser

if __name__ == '__main__':
    args = get_parser().parse_args()

    print('I want to eat {}'.format(args.food_name))
    print('I want to eat {}'.format(args.food))

程序输出

I want to eat fish
Traceback (most recent call last):
  File "./eat.py", line 15, in <module>
    print('I want to eat {}'.format(args.food))
AttributeError: 'Namespace' object has no attribute 'food'

在上述代码中,我们使用dest参数将food参数在程序中使用的名字修改为food_name,这会使得原有的args.food在程序中不能被使用,只能通过args.food_name获取food参数的值。

1.2.7 nargs参数

nargs参数主要用于设置参数的个数。

使用方式如下:

parser.add_argument('--food', nargs=x)

其中x的候选值和含义如下:

含义
? 0或1个参数
* 0或所有参数
+ 所有,并且至少一个参数

例如

# -*- coding: utf-8 -*-

import argparse

def get_parser():
    parser = argparse.ArgumentParser(description="ArgParse Test Demo")
    parser.add_argument('--food',nargs='+')

    return parser

if __name__ == '__main__':
    args = get_parser().parse_args()
    foods = ', '.join(args.food)
    print('I want to eat {}'.format(foods))

使用以下命令行执行上述代码

python eat.py --food fish rice beef

执行结果如下:

I want to eat fish, rice, beef

参考链接