最近在学习关于如何使用YOLO进行目标检测的项目,发现这些大型项目的管理较多采用 argparse库来达到在终端指定默认超参的方式进行便捷式的运行项目,那么我就以该笔记记录下我对于该库的理解,轻易且快速的入手吧!

1 Argparse模块的实验

逐行阅读如下不同参数的引入规范:

#这段python代码请放置为命名为example.py文件内即可

import argparse  #导入argparse库

# 创建 ArgumentParser 对象
parser = argparse.ArgumentParser(description='这是一个示例脚本,用于演示 argparse 的使用。')

# 添加位置参数
parser.add_argument('input_file', help='输入文件的路径')

# 添加可选参数
parser.add_argument('-o', '--output_file', help='输出文件的路径')

# 添加带默认值的参数
parser.add_argument('-n', '--num_iterations', type=int, default=10, help='迭代次数,默认为 10')

# 添加布尔类型参数
parser.add_argument('--verbose', action='store_true', help='是否显示详细信息')

# 解析命令行参数
args = parser.parse_args()

# 使用解析后的参数,此处的核心理解点在于parse_args会将终端传入的参数与上述通过add_argument添加的参数构成字典的键值对
# 所以如下的args.input_file等内容均是字典键值对的访问形式(剧透了)
input_file = args.input_file
output_file = args.output_file
num_iterations = args.num_iterations
verbose = args.verbose

print(f'输入文件: {input_file}')
if output_file:
    print(f'输出文件: {output_file}')
print(f'迭代次数: {num_iterations}')
print(f'是否显示详细信息: {verbose}')

终端运行:

python example.py input.txt -o output.txt -n 20 --verbose

我们能够发现在终端运行的程序中,关于位置参数(即input_file)而言我们是直接输入相应的值(即input.txt),而就可选参数(即-o,主要是针对-o,-n和–verbose有点特殊)而言,都是必须得加上add_argument内的第一个类似标识符一样的命令**(即-o、-n、--verbose)而后才能添加值**(即终端输入的output.txt、20、(只有加入了标识符我们才能正确地传入相应的值!)。

2 相应部分的解释

通过实验部分的直观代码的展示,应该会对他们之间有些表面的印象了,现在针对每一块部分都理解下他们之间的细节之处吧。

import argparse  #导入argparse库
# 创建 ArgumentParser 对象
parser = argparse.ArgumentParser(description='这是一个示例脚本,用于演示 argparse 的使用。')

咱们运用argparse来管理项目的话,必须首先定义好这些规定的开头才能正确调用后续的代码,该为argparse库的框架结构。

位置参数

# 添加位置参数
parser.add_argument('input_file', help='输入文件的路径')

就位置参数这一块,我们对其运用add_argument是没有以---开头的,而是直接以相应描述该超参传递的表示直接开头。

如果项目较为复杂,而且有许多都必需要指定相应的内容进行传递值时,就直接使用位置参数的功能就行,但一旦项目文件内有很多的位置参数,那么我们在终端运行时如何指定相应的输入内容与argparse一直呢?这个问题已经被解决掉:位置参数是按照参数定义的顺序,依次将命令行中未指定选项的参数值赋给对应的位置参数

随后的help='xxx'这一块的内容就容易直观理解:就是解释我们这个参数的作用。

可选参数

# 添加可选参数
parser.add_argument('-o', '--output_file', help='输出文件的路径')

可选参数的开头就是以’-‘或’–'开头,在终端时我们直接指定即可,由于有相应的开头标识符,我们关于可选参数的使用就可以不需要按照规定的顺序咯!

并且可选参数不是必须要调用的, 即可调用也可以不调用,当我们在终端时没调用时他会自动归为None

带默认值的参数

# 添加带默认值的参数
parser.add_argument('-n', '--num_iterations', type=int, default=10, help='迭代次数,默认为 10')

带默认值的参数中由于定义好了default=10,所以在终端不调用他的话,也会默认输出内容为10来在整个项目内充当作用,若我们想要修改的话也可以在终端执行-n you_want_number如20.

布尔类型的参数

# 添加布尔类型参数
parser.add_argument('--verbose', action='store_true', help='是否显示详细信息')

parser.add_argument('--num', type=int, action='store', help='输入一个整数')

parser.add_argument('--values', action='append', type=int, help='输入整数值')

就布尔类型的参数,他也和默认值参数一样在终端的输入中可有可无,不过得需要依据项目的实际情况来操作(因为需要考虑用户针对该项目的用意),他是通过action='store_true'来确定他是否为True,这里的action表示为一个动作,我们需要根据其后面的赋值情况来判断:如果终端命令中输入了--verbose,那么即为True,否则为False.

关于action='store'这个store默认动作,其中type=int表示指定了赋值的数据类型。

关于action='append'这个append默认当作,其表示为我们可以在终端指定该参数多次,并且会逐步将我们输入的多个参数值添加到一个列表内。

python xx.py --values 1 --values 2 --values 3
#这里xx.py是任意的,包含上述命令的文件
return: args.values : [1, 2, 3]

parse_args解析

上述argparse的参数都定义完毕后,为了与我们终端输入的内容进行链接,所以开发者开发了相应的解析命令即parse_args()

args = parser.parse_args()

解析完毕后,我们在终端执行相应的命令(这儿对应的代码是第一部分Argparse模块的实验代码哦):

python example.py input.txt -o output.txt

args对应的解析结果:

args = {
    "input_file": "input.txt",
    "output_file": "output.txt",
    "num_iterations": 10,  # 使用默认值
    "verbose": False  # 未指定,使用默认值
}

所以我们就能清晰地知晓后续赋值的结果了吧,就是字典的键值对取值啊!

input_file = args.input_file
output_file = args.output_file
num_iterations = args.num_iterations
verbose = args.verbose
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐