Необязательный стандартный ввод в Python с argparse - PullRequest
57 голосов
/ 28 сентября 2011

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

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

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

$ someprog | my_python_prog
$ my_python_prog < inputfile

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

Ответы [ 2 ]

101 голосов
/ 14 июня 2012

Стандартная библиотека документации для 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'>)
22 голосов
/ 28 сентября 2011

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

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

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

...