繁体   English   中英

Python argparse - 带有dict选项的选项

[英]Python argparse - option with options to dict

我试图用argparse解析一些选项。 我发现了一些类似的问题并且发现了我认为是一个类似的问题,而Owen在使用Python argparse选项中给出了一个明智的解决方案

我希望能够指定,例如:

script.py infile --line <path to file1> beglab='str1' endlab='str2' 
                 --line <path to file2>  
                 --line <path to file3> beglab='str3' 
                 outfile

--line可以多次指定。 最初我没有额外的行选项参数,我能够创建一个文件列表,没有问题使用:

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 ...]]看起来是正确的,所以我真的很困惑这个错误来自哪里。

我很高兴考虑处理这个的替代方法,我只是喜欢提供这样的输入的简单性并用它们创建一个字典。

您要构建的解析器是不明确的。 如果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

我不确定如何使用argparse实现这一点,但为了简单起见,我会考虑做类似的事情:

--line <path_to_file>,<beglab>,<endlab>

然后在代码中或使用argparse的自定义类型功能解析参数。 您可以让自定义类型函数返回类似{'filepath':'<path_to_file>', 'beglab':'<beglab>', 'endlab':'<endlab>'}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM