【问题标题】:Argparse not recognizing argumentsArgparse 无法识别参数
【发布时间】: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 类吗?

标签: python command-line arguments argparse subparsers


【解决方案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
猜你喜欢
  • 2021-08-16
  • 2013-06-11
  • 1970-01-01
  • 2012-09-30
  • 2015-07-20
  • 1970-01-01
  • 2015-12-07
相关资源
最近更新 更多