Подтвердить что ты не робот

Необязательный stdin в Python с argparse

Я нашел очень полезный синтаксис

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

для указания входного файла или использования stdin - оба из которых я хочу в своей программе. Однако входной файл не всегда требуется. Если я не использую -i или перенаправляю вход с одним из

$ someprog | my_python_prog
$ my_python_prog < inputfile

Я не хочу, чтобы моя программа Python ждала ввода. Я хочу, чтобы он просто двигался и использовал значения по умолчанию.

4b9b3361

Ответ 1

Стандартная библиотека документация для 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'>)

Ответ 2

Используйте isatty для detect, находится ли ваша программа в интерактивный сеанс или чтение из файла:

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

Однако для согласованности и воспроизводимости рассмотрим норму и чтение из stdin, если имя файла -. Возможно, вы захотите рассмотреть возможность управления fileinput.