我正在尝试构建一个命令行解析器,它能够在传递的值之间共享参数,以避免多次输入它们。否则,我希望这两个参数的名称空间是相同的:
import argparse
class PrintAction(argparse.Action):
def __init__(self, option_strings, dest, **kwargs):
super(PrintAction, self).__init__(option_strings, dest, **kwargs)
def __call__(self, parser, namespace, values, option_string=None):
for val in values:
print(val)
parser = argparse.ArgumentParser(description='A foo that foos and a bar that bars')
parser.add_argument('--foo', action=PrintAction)
parser.add_argument('bar', nargs='+')
args = parser.parse_args(['--foo', 'a', 'b', 'c']) # Case 1
args = parser.parse_args(['a', 'b', 'c']) # Case 2然后,我想要一个解决方案,在这两种情况下都将['a', 'b', 'c']存储在bar中,但在提供--foo的情况下,则打印a、b和c。
现在,我得到的是foo只打印a,bar只在case 1中存储b和c,在case 2中显示正确的结果。
发布于 2018-04-18 16:07:41
您需要使--foo成为布尔标志。现在它是一个string参数,因为您没有其他声明。为布尔标志效果将动作设置为store_true。
最后的解决方案如下:
def print_args(args):
if args.foo:
for val in args.bar:
print(val)
parser = argparse.ArgumentParser(description='A foo that foos and a bar that bars')
parser.add_argument('--foo', action='store_true')
parser.add_argument('bar', nargs='+')
args = parser.parse_args(['--foo', 'a', 'b', 'c']) # Case 1
args = parser.parse_args(['a', 'b', 'c']) # Case 2然后在第一种情况下调用print_args(args)将打印a、b和c,而在第二种情况下,它不会。
发布于 2018-04-18 16:33:49
您不能(很容易)欺骗argparse重用argv字符串。解析器为操作分配值。
默认的nargs是None,这意味着使用下一个字符串作为参数。
parser.add_argument('--foo')会设置foo='a'和bar=['b','c']。
在您的操作中,values将是['a'],您将打印它。在optparse中,每个选项都获取剩余的argv列表,它可以随意使用该列表。在argparse中,它只获得它的nargs所需的values。
您可以在__init__中指定nargs=0,然后从sys.argv打印。正如@9000所建议的那样,Eqivalently使其成为一个store_true,并在解析后打印。查看store_true操作类的代码。
另一种选择是给foo和bar一个*,并将foo打印并保存到bar dest中。然后,foo将使用以下所有字符串。但是,如果bar没有任何要保存的内容,它可能会将[]写入命名空间。
在任何情况下,你能做的最好的就是假装重复使用。
另一个想法是在parse_known_args中使用两个不同的解析器。解析器不会干扰sys.argv,因此它可以多次读取和解析。
https://stackoverflow.com/questions/49904183
复制相似问题