2011-09-27 25 views
45

ho trovato la sintassi molto utilestdin Extra in Python con argparse

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

per specificare un file di input o utilizzando standard input-entrambi i quali voglio nel mio programma. Tuttavia, il file di input non è sempre richiesto. Se io non sto usando -i o il reindirizzamento di ingresso con uno dei

$ someprog | my_python_prog 
$ my_python_prog < inputfile 

io non voglio che il mio programma Python attendere per l'input. Voglio che passi e utilizzi i valori predefiniti.

risposta

74

La libreria standard documentation for argparse suggerisce questa soluzione per consentire i file di ingresso opzionale/uscita:

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

So che ho detto questo sulla risposta precedente, ma questo è esattamente ciò che stavo cercando. Grazie. –

+4

Sono assolutamente disorientato. OP ha detto che il file di input non è sempre stato richiesto. Allora, perché è specificato 'infile' prima? Perché questi sono comunque posizionali? Infine, perché diavolo non funzionerebbe il codice OP? Il tutorial 'argparse' sembra implicare che dovrebbe funzionare bene ... – 2rs2ts

+1

@ 2rs2ts _why è' infile' specificato prima? _ - L'ordinamento particolare degli argomenti è solo una convenzione, di solito ci si aspetta che il primo argomento specifichi un input e secondo specificare l'output. _Perché questi sono comunque posizionali? _ - A causa delle preferenze dell'autore. Niente di male in questo uso di argomenti posizionali. Potrebbe essere un po 'imbarazzante da usare nello scenario quando si vuole leggere da stdin e scrivere in un file, ad esempio .app.py - outfile', ma a parte questo argomento posizionale funzionerebbe perfettamente. _Perché diamine non funzionerebbe il codice OP? _ - funziona davvero bene :) –

17

Usa isatty-detect se il programma è in una sessione interattiva o la lettura da un file:

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

Tuttavia, per motivi di coerenza e di riproducibilità, in considerazione dopo la norma e la lettura da stdin se il nome del file è -. Potresti considerare di lasciare che il modulo fileinput lo gestisca.

+0

Questo è esattamente quello che stavo cercando. GRAZIE! –

Problemi correlati