Python argparse:参数的可选值和位置值

时间:2013-02-13 00:07:03

标签: python command-line-arguments argparse

请考虑以下用法:

usage: do.py [-h] [-s | -m] filename

这不是完整的用法。但我实际上希望filename是文件的实际值而不是:

--filename FILENAME

但是,filename也应该是可选的,所以我可以从标准输入中读取。想想UNIX上的cat程序。

你只需说:

cat filename

OR

cat

编辑:现在,如果我在没有任何命令行选项的情况下执行程序do.py,我将获得error: too few arguments。相反,即使我没有给它一个有效的filename,我仍然希望它执行。我该怎么做?

1 个答案:

答案 0 :(得分:5)

更新2:从ArgParse文档中

  

nargs的更常见用法之一='?'是允许可选的输入和输出文件:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
...                     default=sys.stdin)
>>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
...                     default=sys.stdout)
>>> parser.parse_args(['input.txt', 'output.txt'])
Namespace(infile=<open file 'input.txt', mode 'r' at 0x...>,
          outfile=<open file 'output.txt', mode 'w' at 0x...>)
>>> parser.parse_args([])
Namespace(infile=<open file '<stdin>', mode 'r' at 0x...>,
          outfile=<open file '<stdout>', mode 'w' at 0x...>)

原始回答:

这很简单:只需添加一个带有默认值和nargs='*'的位置参数。如果参数为零,则使用默认值,否则将使用命令行上的参数:

>>> p = argparse.ArgumentParser()
>>> p.add_argument('filename', nargs='*', default=['-'])
>>> p.parse_args([])
Namespace(filename=['-'])
>>> p.parse_args(['abc'])
Namespace(filename=['abc'])

通常,-用于表示标准输入/标准输出。

然后你做这样的事情:

def get_inputs(ns):
    """Iterate over input files."""
    for path in ns.filename:
        if path == '-':
            yield sys.stdin
        else:
            yield open(path, 'r')

更新:我认为您需要多个文件名,因为cat需要多个文件名。如果您想要零个或一个文件名,可以使用nargs='?'