argparse --- 命令行选项、参数和子命令解析器 — Python 3.11.2 文档
Python 命令行参数:Argparse 与 Click_click和argparse_半点闲的博客-CSDN博客
Basic
argparse 模块是python内置的一个用于命令项选项与参数解析的模块,argparse 模块可以让人轻松编写用户友好的命令行接口。
import argparse
parser = argparse.ArgumentParser(description='test')
parser.add_argument('--sparse', action='store_true', default=False, help='GAT with sparse version or not.')
parser.add_argument('--seed', type=int, default=72, help='Random seed.')
parser.add_argument('--epochs', type=int, default=10000, help='Number of epochs to train.')
args = parser.parse_args()
print(args.sparse)
print(args.seed)
print(args.epochs)
基本的使用流程如下所示:
1、创建一个解析器——创建 ArgumentParser() 对象
2、添加参数——调用 add_argument() 方法添加参数
3、解析参数——使用 parse_args() 解析添加的参数
add_argument() 方法
参数解释,其余的可以去查询官方文档
name or flags
选项字符串的名字或者列表,例如 foo 或者 -f, --foo。
action
命令行遇到参数时的动作,默认值是 store。即直接储存输入的参数。
如果调整该值为 store_true
的话,那么代码行为就会变成,但凡有任何输入,该参数返回True;若无则返回False
default
不指定参数时的默认值
Type
输入的参数该被转换成的类型
help
参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息
命令行
argparse有一个好处就是可以直接通过命令行来控制python脚本的参数输入,比如
# 显示description
python new.py -h
# 更改seed参数为50
python new.py --seed 50
获得不同的参数命名空间
详见 argparse --- 命令行选项、参数和子命令解析器 — Python 3.12.0 文档
写了一个训练模型的脚本,使用argparse包来统筹参数。但是一部分参数是用于模型训练,比如学习率,weight_decay等等;一部分参数用来指定输出的文件,控制dataloader的行为等。如果想每次训练保存模型使用的参数,那就不可避免的需要将参数分别存放,此时就可以使用
subparsers
一个python文件中如果有多个命名空间,可以用此方法。
import argparse
train_parser = argparse.ArgumentParser(description='test1')
sub1 = train_parser.add_subparsers(title='my_sub parser')
a = sub1.add_parser('sub1')
a.add_argument('--epochs', type=int, default=60)
a.add_argument('--pos_weight', type=int, default=30,
help='a ratio adapted when ture sample was classified properly')
b = sub1.add_parser('sub2')
b.add_argument('--test', type=int, default=123)
test_args = train_parser.parse_args(['sub2'])
print(test_args.__dict__) # 打印出的结果是 {'test': 123}
test_args = train_parser.parse_args(['sub1'])
print(test_args.__dict__) # 打印出的结果是 {'epochs': 60, 'pos_weight': 30}
这种方法实现了分组管理参数,并且可以拥有不同的命名空间。
写一个go.py文件,内容如下
import argparse
train_parser = argparse.ArgumentParser(description='test1')
sub1 = train_parser.add_subparsers(title='my_sub parser')
a = sub1.add_parser('sub1')
a.add_argument('--epochs', type=int, default=60)
a.add_argument('--pos_weight', type=int, default=30,
help='a ratio adapted when ture sample was classified properly')
b = sub1.add_parser('sub2')
b.add_argument('--test', type=int, default=123)
test_args = train_parser.parse_args()
在命令行进行调试
>>> python3 go.py -h
usage: go.py [-h] {sub1,sub2} ...
test1
options:
-h, --help show this help message and exit
my_sub parser:
{sub1,sub2}
>>> python3 go.py sub1 -h
usage: go.py sub1 [-h] [--epochs EPOCHS] [--pos_weight POS_WEIGHT]
options:
-h, --help show this help message and exit
--epochs EPOCHS
--pos_weight POS_WEIGHT
a ratio adapted when ture sample was classified properly
然后尝试传入参数
import argparse
train_parser = argparse.ArgumentParser(description='test1')
train_parser.add_argument('--test2', type=int, default=32)
sub1 = train_parser.add_subparsers(title='my sub parser')
a = sub1.add_parser('sub1')
a.add_argument('--epochs', type=int, default=60)
a.add_argument('--pos_weight', type=int, default=30,
help='a ratio adapted when ture sample was classified properly')
b = sub1.add_parser('sub2')
b.add_argument('--test', type=int, default=123)
x3 = train_parser.parse_args()
print(x3)
进行测试
>>> python3 go.py sub1 --epochs 40
Namespace(test2=32, epochs=40, pos_weight=30)
还可以进行单独的解析器解析
train_parser.parse_args()
x = b.parse_args()
print(x)
>>> python3 go.py --test 33
Namespace(test=33)
[文章导入自 http://qzq-go.notion.site/faf5d369e0fd4bde95f672ffaa825b44 访问原文获取高清图片]