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模块处理它。