4

考虑以下用法:

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

这不是完整的用法。但我实际上想要的是filename成为文件的实际价值,而不是:

--filename FILENAME

而且,filename应该是可选的,所以我可以从标准输入中读取。想想catUNIX 上的程序。

你简单地说:

cat filename

或者

cat

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

4

1 回答 1

7

更新 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='?'如果您想要零个或一个文件名,您可以使用。

于 2013-02-13T00:20:40.187 回答