请考虑以下用法:
usage: do.py [-h] [-s | -m] filename
这不是完整的用法。但我实际上希望filename
是文件的实际值而不是:
--filename FILENAME
但是,filename
也应该是可选的,所以我可以从标准输入中读取。想想UNIX上的cat
程序。
你只需说:
cat filename
OR
cat
编辑:现在,如果我在没有任何命令行选项的情况下执行程序do.py
,我将获得error: too few arguments
。相反,即使我没有给它一个有效的filename
,我仍然希望它执行。我该怎么做?
答案 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='?'
。