Python命令行参数模块argparse

本文将会介绍Python中的命令行参数模块argparse的使用。

argparse是Python标准库中推荐的命令行解析模块,用于解析命令行参数,使得编写用户友好的命令行界面变得容易。 这个模块允许程序定义所需的参数,然后argparse会解析这些参数从sys.argv(命令行)中。一些关键特性和步骤包括:

  • 核心功能:argparse模块建立在ArgumentParser实例上,用于参数规格说明,并包含多个全面应用解析器的选项。 通过add_argument()方法将参数规格说明关联到解析器,支持位置参数、接受各种值的选项以及各种启用/禁用标识。

  • 快速链接:add_argument()方法提供了多种选项,如处理参数、限制可选项集合、存储常量值、设置默认值等。 例如,使用nargs='?'和default可以指定默认值或者在未提供参数时使用的值。

  • 类型:解析器默认将命令行参数当作简单字符串读入,但可以通过type关键字进行类型检查和转换。 可以使用内置类型或自定义函数作为类型转换器,如int、float等。

argparse模块使得Python脚本能够方便地从命令行读取参数,适用于需要频繁修改参数的代码,让代码更简洁且易于维护。

简单示例

下面先介绍一个简单的argparse使用的例子(文件名:demo.py):

1
2
3
4
5
6
7
8
9
import argparse

parser = argparse.ArgumentParser()

parser.add_argument("epoch")

args = parser.parse_args()
print('args: ', args)
print(f"epoch: {args.epoch}")

运行命令python demo.py 10,输出结果为:

1
2
args:  Namespace(epoch='10')
epoch: 10

在这个例子中,我们先实例化ArgumentParser(),然后使用add_argument()方法添加命令行参数,最后再使用parse_args()函数去解析参数。

运行该脚本时,需要在命令行中输入python demo.py 10,其中10对应参数epoch的取值。此时,args的类型为命名空间(Namespace),通过args.epoch获取参数epoch的输入值。

如果不知道该怎么运行该脚本或者需知道脚本中有哪些输入参数,可运行命令python demo.py -h获得帮助,以示例脚本为例,输出结果为:

1
2
3
4
5
6
7
usage: demo.py [-h] epoch

positional arguments:
epoch

options:
-h, --help show this help message and exit

位置参数

argparse的参数共分为两类:位置参数(必选参数)和可选参数,位置参数前面不加-或者--,可选参数前面需要加上-或--(-代表参数名的短选项,即简称)。

我们在前面的示例脚本中已展示过如何使用位置参数,但此时如果输入为python demo.py 10 20,则会报错,原因是只有一个位置参数。

1
2
3
$ python demo.py 10 20
usage: demo.py [-h] epoch
demo.py: error: unrecognized arguments: 20

为了解决参数数量的问题,可使用nargs来解决。

1
2
3
4
5
6
7
8
9
import argparse

parser = argparse.ArgumentParser()

parser.add_argument("epoch", nargs='+')

args = parser.parse_args()
print('args: ', args)
print(f"epoch: {args.epoch}")

nargs是用来说明传入的参数个数,'+' 表示传入至少一个参数。此时再运行python demo.py 10 20命令,输出结果为:

1
2
args:  Namespace(epoch=['10', '20'])
epoch: ['10', '20']

可选参数

本文重点介绍可选参数。

在可选参数中,add_argument函数的参数有type, default, required, choices, help等,列举如下:

  • name or flags: 可选参数(options)或位置参数(positional arguments)。
  • type: 参数类型
  • default: 参数的默认取值
  • required: bool类型,是否是必需参数
  • choices: 枚举类型,指定参数的取值
  • help: 参数的使用说明

示例脚本(文件名:demo.py)如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding: utf-8 -*-
# @place: Pudong, Shanghai
# @file: demo.py
# @time: 2024/3/10 09:09
import argparse

parser = argparse.ArgumentParser()

parser.add_argument("-m", "--model", type=str, required=True, help="model name")
parser.add_argument("-bz", "--batch_size", type=int, choices=[10, 20, 50, 100], help="batch size of the training")
parser.add_argument("-e", "--epoch", type=int, default=10, help="epoch of the training, default value: %(default)r")

args = parser.parse_args()
print(f"model name: {args.model}\nbatch size: {args.batch_size}\nepoch: {args.epoch}")

显示帮助:

1
2
3
4
5
6
7
8
9
10
11
$ python demo.py -h
usage: demo.py [-h] -m MODEL [-bz {10,20,50,100}] [-e EPOCH]

options:
-h, --help show this help message and exit
-m MODEL, --model MODEL
model name, default value: 'BERT'
-bz {10,20,50,100}, --batch_size {10,20,50,100}
batch size of the training
-e EPOCH, --epoch EPOCH
epoch of the training, default value: 10

以下是可能的参数输入方式:

1
2
3
4
5
6
# 指定可选参数
$ python demo.py -m BERT -b 10 -e 30
# 可选参数使用默认值
$ python demo.py -m BERT -b 10
# -b 参数不在参数取值内会报错
python demo.py -m BERT -b 40 -e 30

总结

本文主要介绍了Python中的命令行参数模块argparse的使用,这在平时我们需要频繁修改命令行参数时会非常有用。

欢迎关注我的公众号NLP奇幻之旅,原创技术文章第一时间推送。

欢迎关注我的知识星球“自然语言处理奇幻之旅”,笔者正在努力构建自己的技术社区。


Python命令行参数模块argparse
https://percent4.github.io/Python命令行参数模块argparse/
作者
Jclian91
发布于
2024年4月3日
许可协议