我想解析两个长命令行选项 - 文件列表和如下命令:
python example.py file1 file2 -- echo hello world
结果是:
>>> args.filenames
["file1", "file2"]
>>> args.command
["echo", "hello", "world"]
这在 argparse 或任何其他 python CLI 库(如 docopt)中是否可行?
我想解析两个长命令行选项 - 文件列表和如下命令:
python example.py file1 file2 -- echo hello world
结果是:
>>> args.filenames
["file1", "file2"]
>>> args.command
["echo", "hello", "world"]
这在 argparse 或任何其他 python CLI 库(如 docopt)中是否可行?
在 argparse 中,--
表示将后面的所有内容视为位置字符串。但是您的示例中的所有字符串看起来都是这样的,所以--
什么都不做。所以剩下的问题是,argparse 假设如何将 5 个字符串分配给 2 个参数。 nargs=2
,并且narg='*'
如果您总是想要 2 个“文件”,它会成功。 +
和REMAINDER
( ...
) 也适用于第二个。
不起作用的*
后面是*
. 这类似于'(a*)(a*)'
. 事实上 argparse 使用 RegEx 模式匹配将字符串分配给位置参数。创建 2 个参数并尝试各种nargs
值可能很有启发性。
另一种选择是--
用可选参数替换 ,例如-c
用nargs='*'
.
>>> 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')
,它会在解析输入时为您创建文件对象