Stdin opcional en Python con argparse

He encontrado la syntax muy útil.

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

para especificar un archivo de entrada o usar stdin, ambos de los cuales quiero en mi progtwig. Sin embargo, el archivo de entrada no siempre es necesario. Si no estoy usando -i o redireccionando la entrada con uno de

 $ someprog | my_python_prog $ my_python_prog < inputfile 

No quiero que mi progtwig Python espere entrada. Quiero que se mueva y use valores predeterminados.

La documentación de la biblioteca estándar para argparse sugiere esta solución para permitir archivos de entrada / salida opcionales:

 >>> 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='' encoding='UTF-8'>, outfile=<_io.TextIOWrapper name='' encoding='UTF-8'>) 

Use isatty para detectar si su progtwig está en una sesión interactiva o leyendo un archivo:

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

Sin embargo, en aras de la coherencia y la reproducibilidad, considere seguir la norma y leer desde stdin si el nombre del archivo es - . Es posible que desee considerar permitir que el módulo fileinput maneje eso.