ArgumentParser是命令行执行python文件的不可或缺的module,想必大家都不陌生add_argument()和parse_args(),这是添加参数和解析参数所需要的两个方法,具体方法的使用不再赘述,具体看这位博主,当然,也可以直接看官方文档:argparsehttps://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
是必需的。这可能是库本身的问题,或者是与其他代码交互的问题。下面这些角度也可以作为排查时候的参考思路:
确保没有其他代码修改了参数解析的行为。检查您的代码中是否有其他与参数解析相关的代码,可能会影响到参数的默认值设置。
确认您使用的是正确的库版本。有时候库的不同版本可能会导致不同的行为。
尝试使用最简单的情况来测试参数解析。创建一个最小化的脚本,只包含参数解析的代码,然后看看是否仍然会出现问题。这有助于排除其他代码的干扰。
最终解决
上面的分析可能需要大牛,建议大牛去搞,而笔者在这里就是论事谈解决这个问题的方法,首先很容易想到的是:
将
required
设置为False
:
- 如果您在命令行中不提供
--mode
和--prompt
参数,代码将仍然可以运行,但是您需要在代码中处理这些参数不存在的情况。- 您可以使用默认值来填充缺少的参数,或者采取其他适当的措施来确保代码正常工作。
将
required
设置为True
:
- 如果在命令行中不提供
--mode
和--prompt
参数,您的代码将抛出一个错误,指示这两个参数是必需的。
那既然这样,我直接把required
设置为 False或者把required注释掉不就可以了吗?
此招一出,就地解决!
完结撒花
其实在这个问题的解决过程中耽误了很多的时间,关于问题的解决,我认为求助前人是最快最有效的方法,当然前人的范围很广,我这里的“前人”指的是和你有过同样遭遇并且顺利解决的人。
至此,算是把这个困扰两周的问题画上了圆满的句号,尽管还是没能明白为什么当required设置为True的时候不传参就不加载默认值的奇葩行径,或许需要显式传递 mode=""
和 prompt=""
才能使用默认值填充?这个问题依然没有得到解决,如果有知道的大佬可以教一下我,谢谢鸭~
附加内容
命令行也是可以debug的,在此附上链接,建议采用第一种。python针对命令行传参debug的两种方法 看论文起劲的时候,总想着配合一下代码看看里面到底在做什么,兴高采烈地从github找到作者代码clone下来之后却很想对照代码里面的变量和论文一起看,可惜用的是bash传参,直接用debug会报错,那应该怎么办呢? 一…https://zhuanlan.zhihu.com/p/453742513