Python中的可选标准input与argparse
我发现非常有用的语法
parser.add_argument('-i', '--input-file', type=argparse.FileType('r'), default='-')
用于指定一个input文件或使用stdin,这两个我都想在我的程序中使用。 但是,input文件并不总是必需的。 如果我不使用-i
或redirectinput
$ someprog | my_python_prog $ my_python_prog < inputfile
我不希望我的Python程序等待input。 我希望它只是移动并使用默认值。
argparse的标准库文档build议此解决scheme允许可选的input/输出文件:
>>> 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=<_io.TextIOWrapper name='input.txt' encoding='UTF-8'>, outfile=<_io.TextIOWrapper name='output.txt' encoding='UTF-8'>) >>> parser.parse_args([]) Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>, outfile=<_io.TextIOWrapper name='<stdout>' encoding='UTF-8'>)
使用isatty来检测您的程序是在交互式会话中还是从文件中读取:
if not sys.stdin.isatty(): # Not an interactive device. # ... read from stdin
但是,为了保持一致性和可重复性,如果文件名是-
,请考虑遵循标准并从标准input读数。 你可能要考虑让fileinput
模块处理它。