2011-09-27 29 views
45

me encontré con la sintaxis muy útilentrada estándar opcional en Python con argparse

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

para especificar un archivo de entrada o el uso de la entrada estándar, ambos de los cuales quiero en mi programa. Sin embargo, el archivo de entrada no siempre es obligatorio. Si no estoy usando -i o redirección de la entrada con uno de

$ someprog | my_python_prog 
$ my_python_prog < inputfile 

no quiero que mi programa Python para esperar la entrada. Quiero que se mueva y use valores predeterminados.

Respuesta

74

La librería estándar documentation for argparse sugiere esta solución para permitir que los archivos de entrada opcional/salida:

>>> 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

Sé que dije esto sobre la respuesta anterior, pero _esto_ es _exactamente_ lo que estaba buscando. Gracias. –

+4

Estoy absolutamente desconcertado. OP dijo que el archivo de entrada no siempre era necesario. Entonces, ¿por qué se especifica 'infile' primero? ¿Por qué son estos posicionales de todos modos? Por último, ¿por qué diablos no funcionaría el código de OP? El tutorial 'argparse' parece implicar que debería funcionar bien ... – 2rs2ts

+1

@ 2rs2ts _¿por qué se especifica' infile' primero? _ - El orden particular de los argumentos es solo una convención, normalmente se espera que el primer argumento especifique una entrada y segundo, especifique la salida. _¿Por qué son estos posicionales de todos modos? _ - Debido a la preferencia del autor. No hay nada malo con este uso de argumentos posicionales. Puede ser un poco incómodo utilizarlo en el escenario cuando desee leer de stdin y escribir en un archivo, es decir, 'app.py - archivo_extensivo_ pero distinto de ese argumento posicional funcionaría muy bien. _¿Por qué diablos no funcionaría el código de OP? _ - en realidad funciona bien :) –

17

Uso isatty-detect si el programa está en una sesión interactiva o la lectura de un archivo:

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

Sin embargo, en aras de la coherencia y reproducibilidad, considere siguiendo la norma y la lectura de la entrada estándar si el nombre del archivo es -. Es posible que desee considerar dejar que el módulo fileinput se encargue de eso.

+0

Esto es exactamente lo que estaba buscando. ¡GRACIAS! –

Cuestiones relacionadas