【问题标题】:Python argparse: nargs='?' and optional argumentsPython argparse:nargs='?'和可选参数
【发布时间】:2012-12-02 05:56:30
【问题描述】:

假设我有一个名为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。生成的用法甚至暗示了这一点。

我错过了什么吗?

【问题讨论】:

  • 谁对这个 Q 投了反对票,至少应该在评论中留下建设性的暗示。

标签: python argparse


【解决方案1】:

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

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

这样你不必添加--output参数,除非你想改变默认值,如果你想输出到stdout,你可以使用一个空的--output参数。

【讨论】:

  • 在这种情况下(令人困惑?)default 用于--output 之后的无参数,const 用于完全没有--output 参数。
  • @eidorb:是的,这是倒退的。改变它。使用它应该使用它。
  • 我必须道歉。我的评论是从头到尾的,但我的代码却是我想要的。
  • @eidorb:这是倒退。改变它。按照它应该使用的方式使用它。说真的。
【解决方案2】:

您可以传递“--”来标记任何选项的结束。例如:

python readfile.py --output -- input

具有预期的效果。但是,使 --output 的参数成为必需并允许:

python readfile.py --output - input

可能更干净。

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 2010-12-07
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2018-11-16
    • 2012-11-21
    • 2019-07-12
    相关资源
    最近更新 更多