【问题标题】:Attribution of command line parameter to multiple arguments命令行参数归属于多个参数
【发布时间】:2018-09-28 23:02:21
【问题描述】:

我正在尝试构建一个命令行解析器,它能够在参数之间共享传递的值,以避免必须多次键入它们。否则,我希望两个参数的名称空间相同:

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

然后我想要一个解决方案,在 bar 两种情况下存储 ['a', 'b', 'c'],但在提供 --foo 的情况下,然后将打印 abc

目前,我得到的是 foo 仅打印 abar 仅将 bc 存储在 case 1 中,正确的结果存储在 case 2 中。

【问题讨论】:

    标签: python command-line-arguments argparse


    【解决方案1】:

    您需要将--foo 设为布尔标志。现在它是一个字符串参数,因为您没有另外声明。将action 设置为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) 将打印abc,而在第二种情况下则不会。

    【讨论】:

      【解决方案2】:

      您不能(轻易)欺骗argparse 重用argv 字符串。解析器为动作分配值。

      默认的nargsNone,这意味着使用下一个字符串作为参数。

      parser.add_argument('--foo')
      

      将设置foo='a'bar=['b','c']

      在您的操作中,values 将是您打印的['a']。在optparse 中,每个选项获取剩余的argv 列表,它可以根据需要使用它。在argparse 中,它只得到nargs 要求的values

      您可以在__init__ 中指定nargs=0,然后从sys.argv 打印。同样,正如@9000 建议的那样,将其设为store_true 并在解析后打印。查看store_true Action 类的代码。

      另一个选项是给foobar 一个*,并让foo 打印并保存到bar dest。然后foo 将消耗所有以下字符串。但是,如果bar 没有要保存的内容,它可能会将[] 写入命名空间。

      无论如何,你能做的最好的就是伪造重复使用。


      另一个想法是使用 2 个不同的解析器和 parse_known_args。解析器不会混淆sys.argv,因此它可以读取和解析多次。

      【讨论】:

      • 我最终使用了@9000 解决方案,但感谢您的详细解释。不过,请注意,optparse 似乎已被弃用,建议从现在开始使用 argparse。
      • 根据我在开发人员中看到的讨论,我认为optparse 将长期存在。官方 Python 工具正在慢慢切换到argparse,但还有很多其他用户。 optparse 的某些功能 argparse 无法复制,因为它具有不同的解析方法。
      猜你喜欢
      • 2015-11-30
      • 2012-11-05
      • 2014-06-05
      • 1970-01-01
      • 2017-11-12
      • 2015-04-11
      • 2017-11-04
      • 2018-11-29
      • 1970-01-01
      相关资源
      最近更新 更多