python - Python 3.7 ArgumentParser.add_subparsers 在可选项之前需要位置
问题描述
我正在尝试创建一个 python 脚本,它将根据第一个位置参数执行另一个脚本。沿着git add
行为方式思考。
问题是 ArgumentParser 似乎希望在最后列出位置子命令。这是非常违反直觉的。(当您想列出所有文件时,您会这样做ls -a [FILE positional]
,而不是-a ls [FILE positional]
,那么为什么需要它scriptname [optionals] subcommand
而不是scriptname subcommand [optionals]
因为“子命令”是“真正的”命令?)
玩具示例:
def get_arg_parser():
parser = argparse.ArgumentParser()
# set up subprocessors
subparser = parser.add_subparsers(required=True)
parser.add_argument('--verbose', action='store_const', const=True, default=False, help="Enable verbose output.")
subcommand1_subparser = subparser.add_parser('subcommand1')
subcommand1_subparser.add_argument('--foo1', type=float)
subcommand2_subparser = subparser.add_parser('subcommand2')
subcommand2_subparser.add_argument('--foo2', type=float)
return parser
if __name__ == "__main__":
if len(sys.argv) > 1:
get_arg_parser().parse_args()
# more
else:
get_arg_parser().print_help()
问题是,如果我尝试运行python toyexample.py subcommand1 --verbose
,它会抱怨error: unrecognized arguments: --verbose
. 同时,python toyexample.py --verbose subcommand1
有效,但它需要在您实际打算运行的命令名称之前的选项。
我该如何覆盖这个?
解决方案
感谢@hpaulj,我找到了一个解决方案:只需将共享参数添加到两个子解析器。
我把这parser.add_argument('--verbose', action='store_const', const=True, default=False, help="Enable verbose output.")
条线放在一个add_shared_args_to_parser
to 函数中,然后我调用了两次,传递了子解析器。
最终结果是子解析器有一些不幸(但并不可怕)的重复,而主解析器只有子解析器。
推荐阅读
- angular - 如何在 Angular 的问题路由之间添加动画?
- mysql - 下面使用的 CROSS JOIN 模型是否有更快的替代方案?
- forms - Flutter - 首次使用表单后不显示键盘
- javascript - 如何在循环中跳过未定义的值?
- prolog - 像功能映射函数一样努力使用 Prolog 的 maplist/2
- python - 如何从终端使用 python 3.7 运行机器人框架脚本
- javascript - fetch方法可以编译成旧版JS吗?
- python - Python 使用 cv2 将像素值映射到它的直方图 bin
- reactjs - 当状态包含来自api调用的响应时如何在reactjs中使用三元运算
- android - 选中复选框时,它会更新 recyclerview 中的其他行。用于更新和绑定数据的 DiffUtils 和 DataBinding