Необязательный 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 ждала ввода. Я хочу, чтобы он просто двигался и использовал значения по умолчанию.
Ответы
Ответ 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
.