【Python】执行python脚本命令,向argparse传参时出现 error: unrecognized arguments: True 错误

错误

在使用python脚本命令,向argparse传递参数时,报了下面的错误:

error: ununrecognized arguments: True

脚本命令及argparse代码如下(为了方便解释,做了简化,只保留了发生错误的部分):

argparse代码:

parser.add_argument('--resume', action='store_true', default=False, help='continue to train the model')

命令:

python train.py --resume True

解决方式

先给出这个错误的解决方法,其实很简单,直接去掉True即可

python train.py --resume

这个时候在python代码中解析到的参数resume的值也是True:

args = parser.parse_args()
print(args.resume)  # True

拓展:argparse中action的用法

下面介绍问题出现的原因及原理:

在argparse的add_argument函数中,包含很多参数,如:

  • default:参数的默认值
  • type:参数类型
  • help:参数说明
    等等

上面add_argument语句中,指定该函数的一个参数action,表示关键字(resume)的默认状态,这个默认状态有两种:store_truestore_false

  • 如果action为store_true,则在命令行中不指定参数resume时,其值为False
  • 如果action为store_false,则在命令行中不指定参数resume时,其值为True

用两个例子表示:

parser.add_argument('--resume', action='store_true')
# 如果命令行语句为: python train.py -resume  -> 此时resume 为True
# 如果命令行语句为: python train.py          -> 此时resume 为False
parser.add_argument('--resume', action='store_false')
# 如果命令行语句为: python train.py -resume  -> 此时resume 为False
# 如果命令行语句为: python train.py          -> 此时resume 为True

可以理解为,只有在命令行中,指定该参数,才会触发action,action中储存了true或false,在触发action之后,将储存的值赋值给resume,否则赋值action中储存的值的取反。

如果将action与default结合:

parser.add_argument('--resume', action='store_true', default='false')  # 与不加default一样
# 如果命令行语句为: python train.py -resume  -> 此时resume 为True
# 如果命令行语句为: python train.py          -> 此时resume 为False
parser.add_argument('--resume', action='store_true', default='true')  # 结果永远为True
# 如果命令行语句为: python train.py -resume  -> 此时resume 为True
# 如果命令行语句为: python train.py          -> 此时resume 为True

可以理解为,在触发action时,会按照触发时的结果赋值,但如果没有触发action,default的优先级将大于action中存储值的取反,按照default的值赋值

拓展:另外一种传参方式

除了使用action,也可以直接传bool类型的值,直接在add_argument指定参数类型为bool即可

parser.add_argument("--resume", type=bool, default=True)

在命令行中就需要显示的指定resume是True还是False

python train.py --resume True

在获取参数的时候与获取str或int类型相同,直接使用 args.resume 就可以获取参数的值

目前新版本的argparse应该支持bool类型,在网上看到之前有人使用时,不支持bool类型,在参数解析时,resume解析到的值为字符类型的 “True”,如果出现这个问题的话可以升级argparse,或者对解析到的值进行强制转换:

bool(args.resume)

参考

https://docs.python.org/zh-cn/3/howto/argparse.html
https://wenku.baidu.com/view/5b4c94fbcd2f0066f5335a8102d276a200296020.html
https://blog.csdn.net/zeronose/article/details/122276418
https://blog.csdn.net/qq_35140742/article/details/120607823

猜你喜欢

转载自blog.csdn.net/qq_41340996/article/details/125154451