web-dev-qa-db-ja.com

Python argparseのオプションの標準入力

非常に便利な構文が見つかりました

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

入力ファイルを指定するか、標準入力を使用します。どちらもプログラムで必要です。ただし、入力ファイルは必ずしも必要ではありません。 -iを使用していない場合、または次のいずれかで入力をリダイレクトしていない場合

$ someprog | my_python_prog
$ my_python_prog < inputfile

Pythonプログラムが入力を待つことを望まない。ただ動き、デフォルト値を使用したい。

58
Justin Force

標準ライブラリ 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'>)
102
mikewaters

isatty to detect を使用して、プログラムが対話型セッションであるかファイルから読み取るかを指定します。

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

ただし、一貫性と再現性のために、ファイル名が-の場合、標準に従って標準入力から読み取ることを検討してください。 fileinput モジュールがそれを処理できるようにすることを検討できます。

22
phihag