假设我有一个名为 readfile.py 的简单程序,它通过使用 Python 的 argparse 支持命令行参数。

该程序从由位置参数 input 指定的文件中读取。没有指定额外的参数,这个程序不是很令人兴奋。它只是从 input 读取并退出。可选参数 --output [OUTPUT_FILE] 表示应将输入文件写入文件。 OUTPUT_FILE 也是可选的。如果未指定,则应将输入写入 default.out

我像这样设置我的参数解析器:

parser = argparse.ArgumentParser(description='Read from a file')
parser.add_argument(
    'input',
    help='file to read from')
parser.add_argument(
    '--output',
    nargs='?',
    const='default.out',
    default=None,
    help="""write file to %(metavar)s. If %(metavar)s isn't
         specified, write file to %(const)s.""",
    metavar='OUTPUT_FILE')
args = parser.parse_args()
return args.file, args.output_file

注意我使用 default=None 以便如果 --ouput 没有出现在命令行上,我可以用 None 检测它的缺失。

这给出了这样的用法签名:
usage: readfile.py [-h] [--output [OUTPUT_FILE]] input

如果我运行,这会按预期处理参数
python readfile.py input.in --output somefile.out

或者
python readfile.py --output somefile.out input

如果我运行,它将 output 设置为 default.out
python readfile.py input.in --output

但如果我跑
python readfile.py --output input.in

它提示争论太少。我认为 argparse 足够“聪明”来解释这种模式,将 input 设置为 input.in 并将 output 设置为 default.out 。生成的用法甚至暗示了这一点。

我错过了什么吗?

最佳答案

不,它不会识别这一点。您在最后一个示例中清楚地将 input.in 传递给 --output

我建议您翻转 defaultconst 参数。您希望默认值是 default.out,所以它应该是 default='default.out' 。如果 const 参数为空,则可以将 --output 设置为其他内容。

这样您就不必添加 --output 参数,除非您想更改默认值,并且例如,如果您想输出到 --output ,则可以使用空的 stdout 参数。

关于Python argparse : nargs ='?' and optional arguments,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13875173/

10-15 09:53