Python argparse,运行一个或多个子命令

2024-09-30 23:42:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个程序,能够执行多个子命令。argparse模块非常有用,但我认为它缺乏指定多个子命令的能力。例如,如果我有以下代码:

parser = argparse.ArgumentParser(prog='My Prog')
sub_parsers = parser.add_subparsers()

subcommand_a = sub_parsers.add_parser('subcommand_a', help='a help')
subcommand_a.add_argument('req1', help='required argument 1 help')
subcommand_a.add_argument('--opt1', help='option 1 help')
subcommand_a.add_argument('--opt2', nargs='+', help='option 2 help')

subcommand_b = sub_parsers.add_parser('subcommand_b', help='b help')
subcommand_b.add_argument('req1', help='required argument 1 help')
subcommand_b.add_argument('--opt1', help='option 1 help')
subcommand_b.add_argument('--opt2', help='option 2 help')
subcommand_b.add_argument('--opt3', nargs='+', help='option 3 help')

parser.parse_args()

我不能在命令行上同时指定子命令\u a和子命令\u b。我一次只能做其中一个。我可以想象这需要一个自定义操作,甚至可能需要argparse的子类化,但我不确定从哪里开始。我想把这个程序称为如下:

^{pr2}$

有什么想法吗?在


Tags: 命令程序addparserrequiredargparsehelpargument
2条回答

我做了一些测试,并将子命令更改为其他有效的字符串。 如果使用:

parser = argparse.ArgumentParser(prog='My Prog')
sub_parsers = parser.add_subparsers()

subcommand_a = sub_parsers.add_parser('subcommand_a', help='a help')
subcommand_a.add_argument('req1', help='required argument 1 help')
subcommand_a.add_argument(' opt1', help='option 1 help')
subcommand_a.add_argument(' opt2', nargs='+' help='option 2 help')

subcommand_b = sub_parsers.add_parser('subcommand_b', help='b help')
subcommand_b.add_argument('req1', help='required argument 1 help')
subcommand_b.add_argument(' opt3', help='option 1 help')
subcommand_b.add_argument(' opt4', help='option 2 help')
subcommand_b.add_argument(' opt5', nargs='+', help='option 3 help')

parser.parse_args()

它起作用了。在

我做了一些研究,但没有找到一个字符串相等的子命令。文档的概述也没有说什么。我认为这是一个限制(由选择)或一个bug。 也许你可以在Source Code Hosting里查一下

你的问题基本上和几个月前问的问题一样

Multiple invocation of the same subcommand in a single command line

它想多次调用同一个子命令,但问题是相同的-如何处理多个subparsers参数。在

其中的解决方案要么在将命令行传递给单独解析的片段之前拆分命令行,要么从一个解析中收集“未使用”的片段,以便在第二个或第三个解析中使用。在

以下是对返回2个命令的代码的调整:

import argparse
parser = argparse.ArgumentParser(prog='My Prog')
sub_parsers = parser.add_subparsers(dest='cmd')

subcommand_a = sub_parsers.add_parser('subcommand_a', help='a help')
subcommand_a.add_argument('req1', help='required argument 1 help')
subcommand_a.add_argument(' opt1', help='option 1 help')
subcommand_a.add_argument(' opt2', nargs=3, help='option 2 help')

subcommand_b = sub_parsers.add_parser('subcommand_b', help='b help')
subcommand_b.add_argument('req1', help='required argument 1 help')
subcommand_b.add_argument(' opt1', help='option 1 help')
subcommand_b.add_argument(' opt2', help='option 2 help')
subcommand_b.add_argument(' opt3', nargs=3, help='option 3 help')

argv = "subcommand_a FOO  opt1=bar  opt2 1 2 3 subcommand_b BAR  opt1=foo  opt3 a b c"
rest = argv.split()
while rest:
    [args, rest] = parser.parse_known_args(rest)
    print args
    print rest

哪个打印:

^{pr2}$

我删除了' '(见另一个答案的结尾)

我将opt2和{}改为接受3个参数,而不是变量+。使用+时,它无法判断opt2的列表在哪里结束,下一个命令从哪里开始。在

同样重要的是,不同的命令使用不同的选项(标志)。请注意,第一个opt1以第二个值“foo”结尾,第二个命令则没有。关于这些问题的讨论和解决方法,请参阅另一个帖子。在

相关问题 更多 >