我认为您弄乱了 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'])
更新
在 cmets 中,您会问:
是否有可能我也可以为 --input 选项传递未知数量的参数,然后仍然有 A 选项?比如:program.py --input ./ ../ ../../ A -a_option
如果您想将未知数量的参数传递给--input 选项,您需要将nargs='*' 传递给--input 的参数定义。但是,您不能再使用A 和B 之类的标签来选择您的子解析器,因为这些将作为--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'])
如果您不希望这样做,则需要对冲突参数实施检查。