ArgumentParser中遇到的问题--error: the following arguments are required: --mode, --prompt

文章讲述了在使用Python的ArgumentParser模块处理命令行参数时遇到的错误,特别是在设置required=True且提供默认值时,即使设置了默认值仍报错。作者分析了问题原因并给出了设置required属性为False以及调整默认值策略的解决方案。
摘要由CSDN通过智能技术生成

          ArgumentParser是命令行执行python文件的不可或缺的module,想必大家都不陌生add_argument()和parse_args(),这是添加参数和解析参数所需要的两个方法,具体方法的使用不再赘述,具体看这位博主,当然,也可以直接看官方文档:argparseicon-default.png?t=N6B9https://docs.python.org/zh-cn/3/library/argparse.html#module-argparse

背景分析

        先来说一下应用背景,笔者本人在两次情况下遇到了这个问题:

        1、命令行执行存在问题,需要debug,第一想法是把需要的参数设置为默认值default="***",然后打上断点,然后debug,ok,思路很清晰对不对,但是报错error: the following arguments are required: --mode, --prompt 。

        2、前后端交互时候存在问题,此情况和debug无关,只是单单执行这条语句:

parser = argparse.ArgumentParser(description="Simple example of a training script.")
args = parser.parse_args()

        便出现了报错error: the following arguments are required: --mode, --prompt 。

注:不同的应用场景肯定报错是不同的,笔者在这里为了统一格式,故采用同一应用场景下的error情况,请勿误解。

初步分析

        针对报错信息很容易解读到的是:

根据提供的错误信息,错误提示说缺少--mode和--prompt参数,这意味着你在命令行中没有提供这两个参数。

这种错误通常发生在你使用argparse模块解析命令行参数时,没有正确传递所需的参数。

要解决这个问题,你可以检查以下几个方面:
1、确保在命令行中正确提供了--mode和--prompt参数,例如:
python sever.py --mode train --prompt "Hello, World!"
2、确保你在argparse.ArgumentParser中正确定义了--mode和--prompt参数。例如:
parser.add_argument('--mode', type=str, required=True, help='Mode argument')
parser.add_argument('--prompt', type=str, required=True, help='Prompt argument')

        上述两种情况是最为基础的情况,也是遇到错误之后搜索最容易搜到的情况,但却不一定能解决你所面临的问题,比如:设置的参数中明明有mode和prompt,针对传值的应对是设置默认值,尽管这么做了,依然会出现error: the following arguments are required: --mode, --prompt 。

        那这是什么原因呢?显而易见的是mode和prompt这两个参数值是没有传过去的,至少default值并没有传过去。

进一步分析

        为什么default值没有传过去呢?我明明已经设置了鸭!!!

        那其他参数是怎么做的呢?default也有啊,也不会报错啊,为什么就他俩(prompt和mode)报错了呢?一定有鬼,一定有鬼,别让我逮到你了!

        还真别说一对比,发现了蹊跷的地方:

         其他设置的default之所以能加载,很可能就是受required这个属性值的影响:True or False,如果不设置则默认为 False 。

        所以,如果在参数解析时将参数的 required 属性设置为 True,同时为这些参数提供了默认值,那么按理说在命令行未提供这些参数时,解析器会尝试使用默认值填充参数。但根据上面的描述,即使提供了默认值 default="***",运行时仍然报错指示参数 --mode--prompt 是必需的。这可能是库本身的问题,或者是与其他代码交互的问题。下面这些角度也可以作为排查时候的参考思路:

  1. 确保没有其他代码修改了参数解析的行为。检查您的代码中是否有其他与参数解析相关的代码,可能会影响到参数的默认值设置。

  2. 确认您使用的是正确的库版本。有时候库的不同版本可能会导致不同的行为。

  3. 尝试使用最简单的情况来测试参数解析。创建一个最小化的脚本,只包含参数解析的代码,然后看看是否仍然会出现问题。这有助于排除其他代码的干扰。

 最终解决

        上面的分析可能需要大牛,建议大牛去搞,而笔者在这里就是论事谈解决这个问题的方法,首先很容易想到的是:

  1. required 设置为 False

    • 如果您在命令行中不提供 --mode--prompt 参数,代码将仍然可以运行,但是您需要在代码中处理这些参数不存在的情况。
    • 您可以使用默认值来填充缺少的参数,或者采取其他适当的措施来确保代码正常工作。
  2. required 设置为 True

    • 如果在命令行中不提供 --mode--prompt 参数,您的代码将抛出一个错误,指示这两个参数是必需的。

         那既然这样,我直接把required 设置为 False或者把required注释掉不就可以了吗?

        此招一出,就地解决!

完结撒花

        其实在这个问题的解决过程中耽误了很多的时间,关于问题的解决,我认为求助前人是最快最有效的方法,当然前人的范围很广,我这里的“前人”指的是和你有过同样遭遇并且顺利解决的人。

        至此,算是把这个困扰两周的问题画上了圆满的句号,尽管还是没能明白为什么当required设置为True的时候不传参就不加载默认值的奇葩行径,或许需要显式传递 mode=""prompt="" 才能使用默认值填充?这个问题依然没有得到解决,如果有知道的大佬可以教一下我,谢谢鸭~

 附加内容

        命令行也是可以debug的,在此附上链接,建议采用第一种。python针对命令行传参debug的两种方法 看论文起劲的时候,总想着配合一下代码看看里面到底在做什么,兴高采烈地从github找到作者代码clone下来之后却很想对照代码里面的变量和论文一起看,可惜用的是bash传参,直接用debug会报错,那应该怎么办呢? 一…https://zhuanlan.zhihu.com/p/453742513

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值