我试图用argparse解析一些选项。我发现了一些类似的问题,并在Options with Options with Python argparse?
中找到了Owen给出的合理解决方案,我认为这是一个类似的问题我希望能够指定,例如:
script.py infile --line <path to file1> beglab='str1' endlab='str2'
--line <path to file2>
--line <path to file3> beglab='str3'
outfile
- 可以多次指定行。最初我没有关于行选项的额外参数,我能够使用以下方法创建文件列表而没有问题:
parser.add_argument("--line", action='append')
现在我需要选择添加标签以与线条一起使用。如上所示,可以有与给定线相关联的0,1或2个标签。这就是为什么我觉得提供的链接中的示例似乎是合适的,不幸的是,当我尝试时:
parser.add_argument("--line", action='append', nargs="+")
并运行:
script.py infile --line somefile beglab='A' endlab='B'
--line otherfile beglab='a' endlab='b' outfile
或
script.py infile --line somefile outfile
我收到错误声明参数太少。如果我从命令中删除--line选项,所以我只有位置选项,它可以工作,所以我知道我没有错过任何必要的东西。所以我去了,我读了一下nargs选项。如果指定了--line,它必须至少包含文件名,因此我认为nargs='+'
是合适的选项,它在帮助[--line LINE [LINE ...]]
中看起来是正确的,所以我真的很困惑这个错误来自。
我很乐意考虑处理这个的替代方法,我只是喜欢提供像这样的输入的简单性并用它们创建一个字典。
答案 0 :(得分:2)
您要构建的解析器不明确。如果endlab='b'
是可选的,则argparse无法判断运算符是否意图outfile
是--line
的参数或位置参数。
您不必更改解析器,但必须更改命令行:
尝试:
script.py infile outfile
--line somefile beglab='A' endlab='B'
--line otherfile beglab='a' endlab='b'
或者:
script.py infile
--line somefile beglab='A' endlab='B'
--line otherfile beglab='a' endlab='b'
--
outfile
答案 1 :(得分:0)
我不确定如何使用argparse实现这一点,但为了简单起见,我会考虑做类似的事情:
--line <path_to_file>,<beglab>,<endlab>
然后在代码中或使用argparse的自定义类型功能解析参数。您可以让自定义类型函数返回类似{'filepath':'<path_to_file>', 'beglab':'<beglab>', 'endlab':'<endlab>'}