栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

执行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_true 和 store_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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/958453.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号