2

我想解析两个长命令行选项 - 文件列表和如下命令:

python example.py file1 file2 -- echo hello world

结果是:

>>> args.filenames
["file1", "file2"]
>>> args.command
["echo", "hello", "world"]

这在 argparse 或任何其他 python CLI 库(如 docopt)中是否可行?

4

2 回答 2

1

在 argparse 中,--表示将后面的所有内容视为位置字符串。但是您的示例中的所有字符串看起来都是这样的,所以--什么都不做。所以剩下的问题是,argparse 假设如何将 5 个字符串分配给 2 个参数。 nargs=2,并且narg='*'如果您总是想要 2 个“文件”,它会成功。 +REMAINDER( ...) 也适用于第二个。

不起作用的*后面是*. 这类似于'(a*)(a*)'. 事实上 argparse 使用 RegEx 模式匹配将字符串分配给位置参数。创建 2 个参数并尝试各种nargs值可能很有启发性。

另一种选择是--用可选参数替换 ,例如-cnargs='*'.

于 2013-09-21T13:15:41.503 回答
1
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*')
>>> parser.add_argument('--bar', nargs='*')
>>> parser.parse_args('--foo x y --bar 1 2'.split())
Namespace(bar=['1', '2'], foo=['x', 'y'])

同样对于您的 files 参数,您也可以使用type=argparse.FileType('w')or type=argparse.FileType('r'),它会在解析输入时为您创建文件对象

于 2013-09-21T13:20:25.470 回答