5

假设我有一个名为的简单程序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

如果我跑步,它会设置outputdefault.out

python readfile.py input.in --output

但如果我跑

python readfile.py --output input.in

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

我错过了什么吗?

4

2 回答 2

5

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

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

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

于 2012-12-14T09:03:44.903 回答
0

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

python readfile.py --output -- input

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

python readfile.py --output - input

可能更干净。

于 2015-07-31T16:31:06.080 回答