Argparse 无法识别参数

Posted

技术标签:

【中文标题】Argparse 无法识别参数【英文标题】:Argparse not recognizing arguments 【发布时间】:2019-07-14 13:02:00 【问题描述】:

我在使用 argparse 时遇到了一些问题。我的目标是让用户选择一个且只有一个选项(-a、-b、-c 等),然后选择该选项的参数。我正在使用子解析器来执行此操作:

parser_iq = subparsers.add_parser('iq', help='iq help')
parser_iq.add_argument("-iq", "--index_query", nargs="+", action=required_length(1,6),type=organize_args, help="Choose an index to query for. Start-date, end-date,  "\
           "csv, json, stdout are all optional")

这只是我计划拥有的子解析器之一。

问题:在命令行中运行时:

python3.6 main.py iq "index_name_here"

我收到“index_name_here”无法识别的错误。我是这样解析的:

args = parser.parse_args()

我发现了一些与我类似的问题,但他们将 sys.argv 传递给 parse_args(),这是他们的问题。

我怎样才能让 argparse 识别传递的参数?另外,有没有办法一次只传递一个选项?例如:

正确:

main.py option1 arg1 arg2

错误:

main.py option1 option2 arg1 arg2

谢谢!

【问题讨论】:

python3.6 main.py iq -iq "index_name_here"。第一个iq 标识子解析器。 -iq 标记它的论点。 你在定义required_length Action 类吗? 【参考方案1】:

您必须传递python3.6 main.py -iq "index_name_here" 之类的值(即,使用-iq,而不是iq)。

就提出相互排斥的论点而言,据我了解,子解析器是可行的方法,但我无法就如何继续进行指导提供太多指导。

编辑:

针对您的评论,以下工作是否有效:

python3.6 main.py iq -iq "index_name_here"

?

【讨论】:

感谢您的帮助!当我尝试使用 -iq 运行时,它给了我这个错误:错误:无效选择:'log4j-*'(从'iq'中选择) 是的,iq -iq 有效!我根本没想过,这对我来说没有多大意义。你知道它为什么会这样运行吗? @helloworld95 当你传递iq 时,python 知道调用parser_iq 解析器(因为这是你传递给add_parser 的第一个参数)。此解析器有一个参数,可以通过传递 -iq--index_query 标志及其相关参数来更改该参数。文档不是最好的,但请参阅:docs.python.org/3/library/argparse.html 根据文档,不需要同时指定解析器和参数(iq 和 -iq)。 >>> parser_a = subparsers.add_parser('a', help='a help') >>> parser_a.add_argument('bar', type=int, help='bar help') >>> parser.parse_args([ 'a', '12']) 命名空间(bar=12, foo=False) 好像我在关注文档,但它仍然无法正常工作。 bar 参数是 positional。您的 -iq 是一个标记的 (optionals) 论点。这种区别对于argparse 的工作方式至关重要。 subparsers 参数实际上是一个专门的 positional

以上是关于Argparse 无法识别参数的主要内容,如果未能解决你的问题,请参考以下文章

argparse 错误:无法识别选项

如何让 argparse 识别跟随可变长度可选参数的位置参数?

appdesign中的函数或变量参数无法识别

Bash 脚本无法识别命令行参数? [复制]

无法识别存储过程的记录类型参数

无法反序列化作为参数传递的消息。无法识别序列化格式。