python - Python argparse subparser dest 参数不适用于父级
问题描述
我正在编写一个具有多个模块的实用程序,并且运行哪个模块由一个参数确定。每个模块都有自己的参数,但所有模块将共享 4 个标准参数。为了让它工作,我只是在创建子解析器时设置了“父”参数,但问题是我还需要能够确定在命令行上调用了哪个模块。看起来“dest”参数是执行此操作的方法,但由于某种原因同时设置“父”和“dest”不起作用。
import argparse
parser = argparse.ArgumentParser() # main parser
parser.addArgument("--foo", action='store_true')
subparsers = parser.add_subparsers(dest='cmd')
# without 'parents=[parser]' it properly stores 'bar' in cmd
# however '--foo' MUST be before 'bar'
bar = subparsers.add_parser("bar", parents=[parser], add_help=False)
bar.add_argument("--test", action='store_true')
# should be able to have '--foo' before OR after 'bar'
parser.parse_args(['--foo', 'bar', '--test'])
在此代码中,add_subparsers
调用将 dest 设置为“cmd”。然后,我可以解析参数并调用args.cmd
以获取被调用模块的名称(在本例中为 bar)。但是,当parents
设置时,cmd 的值始终为 None。目前我的解决方法是只使用一个空的主解析器,然后简单地将 4 个标准参数复制粘贴到每个子解析器,这可行但并不完全理想。
我的问题:有没有另一种方法来确定哪个模块被调用?为什么会发生这种情况?
解决方案
感谢@hpaulj 在对 OP 的评论中提供的信息,我设法让它工作。
基本上,您需要主解析器和父解析器。然后parents
,您将子解析器的属性设置为父解析器。根据您提供的示例,以下应该是一个工作示例:
import argparse
# Create parsers
parser = argparse.ArgumentParser()
parent_parser = argparse.ArgumentParser()
# Add arguments to parent parser
parent_parser.add_argument("--foo", action='store_true')
# Create subparser
subparsers = parser.add_subparsers(dest='cmd')
# Add to the subparser
bar = subparsers.add_parser("bar", parents=[parent_parser], add_help=False)
bar.add_argument("--test", action='store_true')
baz = subparsers.add_parser("baz", parents=[parent_parser], add_help=False)
baz.add_argument("--baz-test", action="store_true")
# should be able to have '--foo' before OR after 'bar'
print(parser.parse_args(['bar', '--test']))
print(parser.parse_args(["baz", "--baz-test"]))
这将输出以下内容:
Namespace(cmd='bar', foo=False, test=True)
Namespace(baz_test=True, cmd='baz', foo=False)
然后,您应该能够执行以下操作:
args = parser.parse_args()
if args.cmd == "bar":
print("bar was specified")
elif args.cmd == "baz":
print("baz was specified")
它可能不是完美的解决方案,但它应该可以工作。
(使用 Python 3.5.2 测试)
推荐阅读
- c# - PeekLock 模式下的 Peek() 方法是否会锁定服务总线消息?
- java - 负面 REST 响应中缺少正文
- javascript - 设置 cookie 以记住用户的语言选择
- javascript - 为什么链接到其他对象的对象 (OLOO) 模式不使用 Object.create 来设置键/值对?
- javascript - CORS Origin 标头
- sql-server - 通过设置日期范围查询强制年份基于月份
- c++ - 如何使用 SDL2 为每个线程设置一个共享的 OpenGL 上下文?
- sql - 获取 PLS-00382:表达式类型错误
- fluid - 翻译 powermail 表格
- rust - 在循环/赋值中:预期类型参数`T`,找到`&T`