Python argparse - 带有命令选项的选项
Python argparse - option with options to dict
我正在尝试使用 argparse 解析一些选项。我发现讨论了一些类似的问题,并发现我认为是 Owen 在 Options with Options with Python argparse?
中给出的明智解决方案的类似问题
我希望能够指定,例如:
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 个标签与给定行相关联。这就是为什么我觉得 link 中提供的示例似乎很合适,不幸的是,当我尝试时:
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 ...]]
中看起来是正确的,所以我真的很困惑这个在哪里错误来自。
我很乐意考虑处理这个问题的替代方法,我只是喜欢提供这样的输入并用它们创建字典的简单性。
我不确定如何使用 argparse 完成此操作,但为了简单起见,我会考虑执行以下操作:
--line <path_to_file>,<beglab>,<endlab>
然后在代码中或使用 argparse 的自定义类型功能解析参数。您可以让自定义类型函数 return 像 {'filepath':'<path_to_file>', 'beglab':'<beglab>', 'endlab':'<endlab>'}
这样的字典
您要构建的解析器不明确。如果 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 解析一些选项。我发现讨论了一些类似的问题,并发现我认为是 Owen 在 Options with Options with Python argparse?
中给出的明智解决方案的类似问题我希望能够指定,例如:
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 个标签与给定行相关联。这就是为什么我觉得 link 中提供的示例似乎很合适,不幸的是,当我尝试时:
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 ...]]
中看起来是正确的,所以我真的很困惑这个在哪里错误来自。
我很乐意考虑处理这个问题的替代方法,我只是喜欢提供这样的输入并用它们创建字典的简单性。
我不确定如何使用 argparse 完成此操作,但为了简单起见,我会考虑执行以下操作:
--line <path_to_file>,<beglab>,<endlab>
然后在代码中或使用 argparse 的自定义类型功能解析参数。您可以让自定义类型函数 return 像 {'filepath':'<path_to_file>', 'beglab':'<beglab>', 'endlab':'<endlab>'}
您要构建的解析器不明确。如果 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