我找到了非常有用的语法
parser.add_argument('-i', '--input-file', type=argparse.FileType('r'), default='-')
用于指定输入文件或使用stdin - 我想在程序中使用它们。但是,并不总是需要输入文件。如果我没有使用-i
或使用
$ someprog | my_python_prog
$ my_python_prog < inputfile
我不希望我的Python程序等待输入。我希望它只是移动并使用默认值。
答案 0 :(得分:95)
标准库documentation for argparse建议此解决方案允许可选的输入/输出文件:
>>> 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'>)
答案 1 :(得分:22)
使用isatty到detect无论您的程序是在交互式会话中还是从文件中读取:
if not sys.stdin.isatty(): # Not an interactive device.
# ... read from stdin
但是,为了保持一致性和可重复性,如果文件名是-
,请考虑遵循规范并从stdin读取。您可能需要考虑让fileinput
模块处理该问题。
答案 2 :(得分:6)
以the answer regarding TTY detection为基础,以明确回答问题:
import sys
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--input-file', type=argparse.FileType('r'), default=(None if sys.stdin.isatty() else sys.stdin))