date
icon
password
博客链接
Pin
Pin
Hide-in-Web
Hide-in-Web
网址
type
slug
tags
category
bottom
bottom
Hide-in-Config
Hide-in-Config
comment
status
summary
最近学习了 argparse 库,趁热打铁写了一篇笔记,便于大家学习以及自己日后复习🤠。
argparse
库是用于做命令行解析的库,通常用在有大量参数且参数的值需要频繁修改或者需要在多个代码文件中共享参数配置的情形下,最常用的就是在深度学习领域了。通过
argparse
库,我们可以快速地在命令行中了解代码里所有参量及其用处,并且为参量赋值。在使用
argparse
库共享参数配置时,各个参数值都会排列的很整齐,同时各个参数的作用一目了然。我们可以将
argparse
库当作是一个提前制做好的模板或一套我们自己设定的标准,就像是类和对象中的工厂类一样,等学完 argparse 库,你会有更深的认识。argparse
库是 python
的内置库,要使用 argparse
库,需要在代码开头导入模块 import argparse
。接下来就按照三个步骤来进行使用即可:
1. 创建解析器
具体的语法如下:
可以将创建解析器的过程理解为是 类与对象 里面的创建对象,即创建一个解析器对象,在之后就可以使用这个对象来调用
argparse
中的各种方法了。另外说明,如果要创建多个解析器,与创建多个对象一样,使用多个解析器名就可以。
2. 添加参数和参数配置
使用
argparse
的 .add_argument
方法可以设置解析器内部的参数,参数包含可选的和必选的。前面我们介绍过,argparse 可以在命令行中快速的修改参数值,但在参数数量很多的情况下,我们不可能将所有参数都一个一个赋值。
因此根据目标的不同,我们会在每次实验中更改不同的参数(控制变量法),而那些在本次实验中不研究的参数,可以让它赋默认值,等需要的时候再进行更改。
要实现这样灵活的功能,我们就需要合理的安排(通过
.add_argument
合理设置)可选参数和必选参数。下面我会先介绍如何在代码中设置参数,然后再介绍如何在命令行和代码中调用并修改这些参数。
最基础的 argparse
设置参数的方法
在这个部分,大家将学会如何创建位置参数(必选参数)和可选参数。
下面这条语句创建了一个位置参数,这是创建参数最简单的方式,只需要在括号中放入一个字符串,就可以创建一个位置参数。
.add_argument()
括号中放入的字符串即为参数的名字,在上面的语句中我创建了一个名为 “位置参数” 的参数,你可以将它理解为一个变量,变量中默认存储的数据类型是字符串。argparse 中的参数名字最好都设置为英文,但在本篇教程中,为了方便大家理解,就使用中文的名称来介绍了。
下面创建可选参数,通过在参数名前面加上两个减号
--
来创建可选参数。上面这条语句很轻松就创建了一个名为 “可选参数” 的参数名,默认存储的数据类型也是字符串。
在实际应用中,使用两个减号创建的可选参数的名字一般是全名,因此它通常会比较长,为了在命令行中更方便的调用和赋值,我们会给可选参数起一个别名。别名通过一个减号
-
来进行创建。需要注意的是,必选参数无法设置别名,只有可选参数可以。在上面这行语句中,创建了一个全名为
your_full_name
的参数,参数的别名为 n
,在后面调用参数及赋值的时候,我既可以使用参数的全名,也可以使用参数的别名。argparse
帮助文档及命令行调用
在这个部分,大家会学会如何在命令行中查看先前设置参数的帮助文档以及如何在命令行中调用参数。
通过上面基础语法的介绍,我们已经能够在
argparse
中设置参数了,不过此时我们还难以有实在的感受,参数虽然设置了,但我们该如何查看、修改它呢?想要查看、修改这些参数,可以在命令行中进行,也可以在代码中进行(关于如何在代码中修改参数会在后面的“解析参数”部分介绍)。
如何打开命令行提示符?
第一种方法:
直接通过
pycharm
进行操作。在 pycharm 的交互显示窗口中找到下图所示的终端然后点击进入。检查
PS
后面的项目路径是否为自己将要运行的代码文件的项目路径,若不是,需要 cd 文件夹名称
(可以为中文)先进入文件夹,然后再进行后面的操作。
第二种方法:
直接在要进入的文件夹中输入 cmd,这样 cmd 中的默认地址就已经是项目地址了。
第三种方法:
首先按下
Win+R
,在弹出的窗口中输入 cmd
即可打开命令行提示符。如果使用的是第三种方法,那么在命令行中,我们需要先输入盘符 (如
D:
)进入对应的磁盘,然后再通过 cd 项目路径
来进入我们的项目文件夹。比如我的项目在 D:\test
中,我就需要在命令行中先写上 D:
进入 D 盘,然后通过cd D:\test
进入项目文件夹(注意 cd
后面有空格)。帮助文档的查看及 --help
参数的介绍
之后要进行的步骤以下面所示的代码为基础:
在打开命令行提示符并进入相应的项目文件夹后,输入
python 测试文件.py -h
即可查看 argparse
的帮助文档,帮助文档中包含在代码中定义的所有必选参数和可选参数,同时帮助文档的开头为 description
中的内容 “argparse 示例教程”:在上面的帮助文档中,我们注意到有一个可选参数是我们没有定义的,即
--help
参数,它是解析器创建每个参数时都会自带的一个可选参数,别名是 -h
,有了它,我们可以很方便的向别人解释这个参数的作用。命令行中修改参数
我们先介绍参数在命令行中的修改方式。后面的介绍以上面的代码为基础:
在前面,我们通过
python 测试文件.py -h
语句在命令行中查看了帮助文档,这条语句中的 python 测试文件.py
前缀表示对 测试文件.py
进行 python 相关操作。具体操作的内容是什么,需要看 .py
后面的指令内容,如 -h
。因此如果我们需要修改参数,我们就需要先指定对哪个文件操作,先写上固定前缀
python 测试文件.py
。在修改参数之前,我们必须注意,位置参数(必选参数)是必须要赋值的,且必须按顺序赋值。如果想要不按顺序赋值(类似于函数中的关键字传参),就需要使用可选参数(后面会介绍一个
required
方法可与之很好的配合)。位置参数(必选参数)的赋值(修改):
比如有一个人是张三,北京市的,我们可以这样写
python 测试文件.py 张三 北京
,输出的结果为 Namespace(姓名='张三', 省市='北京', 性别=None, age=None)
。(Namespace 表示存储解析后参数的对象的空间,它是一个类似于字典的对象,可以通过属性名访问参数值。)在 Namespace 中,我们可以看到,
姓名
就已经赋值为了 "张三"
,省市
被赋值为"北京"
,而性别
和 age
是可选参数,在没有赋值的情况下为 None
。可选参数的赋值(修改):
比如北京市张三的年龄为 18 岁,性别为男,我们就可以在命令行中这样赋值,
python 测试文件.py 张三 北京 --性别 男 --age 18
输出的结果为:Namespace(姓名='张三', 省市='北京', 性别='男', age='18')
(注意这里的年龄为字符串类型,后面会教大家如何修改类型);可选参数的赋值可以不用像位置参数一样按顺序赋值,因此后面这条语句的效果与前面是一致的: python 测试文件.py 张三 北京 --age 18 --性别 男
。在前面的代码中,我们给
age
这个可选参数设置了一个别名 年龄
,在命令行中赋值的时候,可以使用年龄
来进行赋值,如 python 测试文件.py 张三 北京 -年龄 18 --性别 男
。在使用别名进行赋值时,别名前面只能有一个减号,否则会报错。argparse
的常见参数及用法
argparse
参数设置时有一点需要注意:argparse
的位置参数要放在关键字参数前面,关键字参数内部可以随意顺序。
type
→ 设置参数类型
在前面我们介绍过,解析器设置的参数默认都是字符串类型的,如果想要将参数设置为其他类型,比如把年龄设置为数字类型,可以使用
type
参数。type 参数可以设置的类型有
int
,float
,str
,bool
(bool
需结合 action
参数使用)。type 参数的使用方法如下:
default
→ 设置参数默认值
default
是用于设置参数默认值的,这样在参数没有在命令行中赋值的情况下,它也能有一个值,而非 None
;可选参数和位置参数都可以使用
default
参数,先介绍可选参数 default
的使用,再介绍位置参数 default
的使用。可选参数在设置了
default
的后,在我们没有显式为其复制的情况下,可以使用默认值。使用的示例如下:对于位置参数而言,情况会稍复杂一些,如果设置了
default
参数,在命令行中仍然需要显式的为参数赋值;那么既然都需要赋值,
default
参数在位置参数中是否并无用处呢?并非如此,在位置参数中,
default
需要与后面将会介绍的 nargs
参数搭配使用,nargs
参数用于控制参数接受值的数量。下面先举一个例子,在下面的例子中会使用到
nargs
参数,我们只需要先知道 nargs="?"
表示接收 0 或 1 个参数:nargs
→ 参数接收数量设置
在使用nargs
设置位置参数的接收数量时需要记住:参数接收值越多的参数应放在越后面定义。如果使用可选参数,那么没有此限制。
首先说明一下 nargs 的取值,nargs 可以有以下这些取值:
- 直接指定参数数量(整数);
?
:表示可以接收 0 或 1 个值;
+
:表示必须接收至少 1 个值;
*
:表示接收任意数量参数(包括 0 个);
下面是该参数的代码示例:
choices
→ 限制可选项
即参数的值只能从给定的列表值中选择,否则会报错。
required
→ 是否必须(仅用于可选参数)
required
为 True
时,意味着可选参数是必须要赋值的。利用
required
参数,我们可以将可选参数当作是必选参数来用,同时用能够不按照顺序赋值。metavar
→ 帮助文档中的参数占位符
metavar
常用做帮助文档中参数的精简说明,而 help
常用于详细地说明。dest
→ 解析结果的属性名
这个参数可以在学习完“解析参数”部分后再查看。
这个参数类似于可选参数中的别名(之前介绍过,使用一个短斜杠 “
-
” 定义),但与别名不同的是,dest
参数设置的名字是在代码中调用并赋值的,而通过 “-
” 方式定义的别名只能够在命令行中使用。dest
参数本质上是将原来的参数名进行替换,替换后原参数名就不会发挥作用了。但是,
dest
替换后的参数名无法在命令行中使用,命令行中只能使用全名和短斜杠定义的别名。这里假设大家已经阅读完解析参数部分的内容了。下面是关于该参数的代码示例:
使用 dest 参数时需要注意以下几点:
- 位置参数无法使用 dest 属性;
- 使用了 dest 参数更换参数名后,原来的全名就无法使用了;
action
→ 参数处理动作(一般不用)
action
参数决定了如何处理命令行输入的参数值,是参数解析的核心控制开关。通过不同动作类型,可以实现存储值、统计次数、触发操作等功能。action
参数在我们不指定时,默认的值是 store
,即存储用户输入的参数值(显式赋值),如 python 测试文件.py --name "张三"
,给 name
参数赋值张三
。如果我们要指定 action 参数,通常有三个参数可以选择:
store_true
/store_false
;
用于让参数存储布尔值,如果
action
为 store_true
,则其布尔值默认为 False
;如果 action
为 store_false
,则其布尔值默认为 True
。在命令行中,当我们显示调用该参数(不需要为其赋值)时,参数的布尔值就会反转。
如,我们通过代码
parser.add_argument("--bool", action="store_true", help="存储布尔值,默认为 False")
定义了一个可选参数 bool
,它内部的值默认是 False
,但在命令行中我们输入 python 测试文件.py --bool
时,bool
参数的值就会反转为 True
。append
;
用于收集多个参数值到列表,相当于是将参数类型设置为了 list 型,可以存放多个值;
在命令行中,我们可以通过多次调用参数并赋值来实现添加列表元素。
如,我们通过代码
parser.add_argument("--list", action="append", help="将对参数多次赋值的结果以列表形式存放")
定义了一个可选参数 list
,在命令行中我们输入 python 测试文件.py --list "张三" --list "李四"
就可以向 list 参数中添加 "张三"
和 "李四"
两个元素。count
;
用于统计参数出现次数(参数的值就是参数调用的次数),我们在命令行中每调用一次参数,参数内部的值就会加 1;
如,我们通过代码
parser.add_argument("--count_num", action="count", help="记录参数调用次数")
定义了一个可选参数 count_num
,在命令行中我们输入 python 测试文件.py --count_num --count_num
,由于调用了两次 count_num
参数,因此参数内部存储的值就是 2。3. 解析参数
以下的介绍基于下面的代码:
如果要在代码中为参数赋值,参数名最好不要使用中文,如果一定需要使用中文,那么请将中文参数设置为可选参数,这样可以通过
dest
参数来设置英文属性名,如 parser.add_argument("--姓名", "-name", dest="name", help="用于记录用户的姓名")
。在离开本篇教程后,大家自己使用 argparse
库时,尽量都使用英文来命名参数。解析命令行参数首先要创建一个解析对象,创建解析对象需要调用解析器的
.parse_args()
方法。具体代码如下:不要将创建解析器对象的代码和创建解析器的代码混淆。
创建解析器:
parser = argparse.ArgumentParser(description="解析器")
创建解析器对象:
args = parser.parse_args()
它们的名字通常使用
parser
和 args
,当然也可以自定义。创建了解析器对象以后,如果需要将其打印输出需要进行如下操作:
如果我们创建了两个解析器对象怎么办呢?命令行中还能进行赋值操作吗?
先看下面的代码:
在命令行中,如果我们想要更改解析器对象 args_1 的 name,我们会使用命令行语句
python 测试文件.py —name 张三
。此时按下回车,我们会发现两个解析器对象都被修改了,因此在命令行中很难将两个解析器对象分隔开来赋值。
当然,一个可行的解决方案是,干脆创建两个解析器,每个解析器再单独创建一个解析对象:
上面这种方式是可行的,但给人的感觉总有点不优雅,或者说有种代码 “冗余” 的错觉。
为了要实现两个解析器对象的分别赋值,我们可以采用在代码中修改参数的方法。
如何在代码中修改参数?
有些人可能会疑惑,我们一开始使用 argparse 库的目的之一不就是为了能够在命令行中快捷修改参数,或是临时改变参数值吗?这样不会与我们的目标背道而驰吗?
确实是,如果我们使用了两个解析器对象,在命令行中就很难对两个对象进行调控。
即便只是创建了一个解析器对象,但在代码中对参数进行赋值的方式,也会使得该参数在命令行中的值无法被修改。
因此,在代码中为参数赋值,多半是出于共享多个代码文件中参数配置的目的。
在代码中修改参数的时候不要使用短斜杠形式命名的别名,比如定义了一个参数
parser.add_argument("--gender", "-gen", help="记录性别")
,在代码中就不能使用 gen
这个别名来对参数赋值或打印输出,否则会报错。首先,我们看看如何在代码中为参数赋值?
通过
args.参数名
访问参数值,并直接在代码中使用。比如:接下来,我们看看如何创建两个解析器对象并赋值。
argparse
使用案例
这个部分是部分深度学习的代码摘录,让大家对argparse
库的使用有一个直观的理解。
编辑于 2025.3.13.
如果本篇笔记对你有用,能否『请我吃根棒棒糖🍭 』🤠…