75

非常に便利な構文を見つけました

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

入力ファイルを指定したり、stdinを使用したりするために使用します。どちらもプログラムに必要です。ただし、入力ファイルは必ずしも必要ではありません。のいずれかで入力を使用-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

ただし、一貫性と再現性を確保するために、ファイル名が。の場合は、標準に従い、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 に答える