75

我发现了非常有用的语法

parser.add_argument('-i', '--input-file', type=argparse.FileType('r'), default='-')

用于指定输入文件或使用标准输入——我想要在我的程序中使用这两者。但是,并不总是需要输入文件。如果我没有使用-i或重定向输入之一

$ someprog | my_python_prog
$ my_python_prog < inputfile

我不希望我的 Python 程序等待输入。我希望它继续前进并使用默认值。

4

3 回答 3

131

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'>)
于 2012-06-14T17:43:37.180 回答
22

使用isatty检测您的程序是处于交互式会话中还是从文件中读取:

if not sys.stdin.isatty(): # Not an interactive device.
  # ... read from stdin

但是,为了一致性和可再现性,如果文件名是-. 您可能需要考虑让fileinput模块来处理它。

于 2011-09-27T22:52:40.967 回答
13

在有关 TTY 检测的答案的基础上,明确回答问题:

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))
于 2020-04-29T22:34:52.123 回答