我想解析两个长命令行选项 - 文件列表和如下命令:
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
,如果您总是想要 2 个"文件",narg='*'
就可以了。 +
和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'])
同样对于您的文件参数,您还可以使用 type=argparse.FileType('w')
或 type=argparse.FileType('r')
,它将在解析输入时为您创建文件对象