Python Argparse 子解析器
Python Argparse subparsers
我正在使用 Argparse 模块来解析命令行选项。我有一个调用下标 A 或下标 B 的主脚本。我现在有一个用于 A 和 B 的子解析器实例和一个主解析器实例,它应该包含有关 A 和 B 需要的变量的信息。类似于:
def __init__(self):
parser = argparse.ArgumentParser("Parser")
parser.addArgument('--input') #this should be availabe for A and B
subparsers = parser.add_subparsers('Description')
A_parser = subparsers.add_parser(A)
A_paser.add_argument('--a_option')
B_parser = parser.add_subparser('Description')
B_parser.add_arguemnt('--b_option')
args = parser.parse_args()
但是如果我这样使用它,如果我在程序调用时没有指定 A 或 B,我只能通过 --input 选项更改 args.options。执行
program.py A --input ./
或
program.py --input ./ A
都失败了。
我认为您搞砸了 python 文档中的示例用法。我试图编辑您的代码示例,但拼写错误太多,我放弃了。特别是 add_subparsers()
和 add_parser()
的用法混淆了。
代码的清理(和独立)版本如下所示:
import argparse
parser = argparse.ArgumentParser("Parser")
parser.add_argument('--input') #this should be available for A and B
subparsers = parser.add_subparsers(help='Description')
A_parser = subparsers.add_parser('A')
A_parser.add_argument('--a_option')
B_parser = subparsers.add_parser('B')
B_parser.add_argument('--b_option')
现在可以打电话了
args = parser.parse_args(['--input', 'foo'])
还有
args = parser.parse_args(['--input', 'bar', 'A', '--a_option', 'a_option_arg'])
和
args = parser.parse_args(['--input', 'baz', 'B', '--b_option', 'b_option_arg'])
更新
在评论中,你问:
Is it possible that I can also pass a unknown number of arguments for the --input option and still have the A option after that? Something like: program.py --input ./ ../ ../../ A -a_option
如果您想将未知数量的参数传递给 --input
选项,您需要将 nargs='*'
传递给 --input
的参数定义。但是,您不能再将 A
和 B
之类的标签用于 select 您的子解析器,因为这些将被视为 --input
.
的进一步参数
在这种情况下,您可以求助于父解析器。使用父解析器,您可以将多个解析器的选项合并为一个:
import argparse
A_parser = argparse.ArgumentParser(add_help=False)
A_parser.add_argument('--a_option')
B_parser = argparse.ArgumentParser(add_help=False)
B_parser.add_argument('--b_option')
parser = argparse.ArgumentParser("Parser", parents=[A_parser, B_parser])
parser.add_argument('--input', nargs='*') # this should be available for A and B
现在所有选项每次都可用:
args = parser.parse_args(['--input', 'foo'])
args = parser.parse_args(['--input', 'foo' , 'bar', '--a_option', 'a_option_arg'])
args = parser.parse_args(['--input', 'baz', '--b_option', 'b_option_arg'])
请注意,不再有 'A' 和 'B' 标签。通过选择 A_parser
定义的选项之一来选择 'A'。甚至允许同时使用:
args = parser.parse_args(['--input', 'foo' ,'--a_option', 'a_option_arg', '--b_option', 'b_option_arg'])
如果您不想这样做,则需要执行冲突参数检查。
我正在使用 Argparse 模块来解析命令行选项。我有一个调用下标 A 或下标 B 的主脚本。我现在有一个用于 A 和 B 的子解析器实例和一个主解析器实例,它应该包含有关 A 和 B 需要的变量的信息。类似于:
def __init__(self):
parser = argparse.ArgumentParser("Parser")
parser.addArgument('--input') #this should be availabe for A and B
subparsers = parser.add_subparsers('Description')
A_parser = subparsers.add_parser(A)
A_paser.add_argument('--a_option')
B_parser = parser.add_subparser('Description')
B_parser.add_arguemnt('--b_option')
args = parser.parse_args()
但是如果我这样使用它,如果我在程序调用时没有指定 A 或 B,我只能通过 --input 选项更改 args.options。执行
program.py A --input ./
或
program.py --input ./ A
都失败了。
我认为您搞砸了 python 文档中的示例用法。我试图编辑您的代码示例,但拼写错误太多,我放弃了。特别是 add_subparsers()
和 add_parser()
的用法混淆了。
代码的清理(和独立)版本如下所示:
import argparse
parser = argparse.ArgumentParser("Parser")
parser.add_argument('--input') #this should be available for A and B
subparsers = parser.add_subparsers(help='Description')
A_parser = subparsers.add_parser('A')
A_parser.add_argument('--a_option')
B_parser = subparsers.add_parser('B')
B_parser.add_argument('--b_option')
现在可以打电话了
args = parser.parse_args(['--input', 'foo'])
还有
args = parser.parse_args(['--input', 'bar', 'A', '--a_option', 'a_option_arg'])
和
args = parser.parse_args(['--input', 'baz', 'B', '--b_option', 'b_option_arg'])
更新
在评论中,你问:
Is it possible that I can also pass a unknown number of arguments for the --input option and still have the A option after that? Something like:
program.py --input ./ ../ ../../ A -a_option
如果您想将未知数量的参数传递给 --input
选项,您需要将 nargs='*'
传递给 --input
的参数定义。但是,您不能再将 A
和 B
之类的标签用于 select 您的子解析器,因为这些将被视为 --input
.
在这种情况下,您可以求助于父解析器。使用父解析器,您可以将多个解析器的选项合并为一个:
import argparse
A_parser = argparse.ArgumentParser(add_help=False)
A_parser.add_argument('--a_option')
B_parser = argparse.ArgumentParser(add_help=False)
B_parser.add_argument('--b_option')
parser = argparse.ArgumentParser("Parser", parents=[A_parser, B_parser])
parser.add_argument('--input', nargs='*') # this should be available for A and B
现在所有选项每次都可用:
args = parser.parse_args(['--input', 'foo'])
args = parser.parse_args(['--input', 'foo' , 'bar', '--a_option', 'a_option_arg'])
args = parser.parse_args(['--input', 'baz', '--b_option', 'b_option_arg'])
请注意,不再有 'A' 和 'B' 标签。通过选择 A_parser
定义的选项之一来选择 'A'。甚至允许同时使用:
args = parser.parse_args(['--input', 'foo' ,'--a_option', 'a_option_arg', '--b_option', 'b_option_arg'])
如果您不想这样做,则需要执行冲突参数检查。