web-dev-qa-db-fra.com

Stdin facultatif dans Python avec argparse

J'ai trouvé la syntaxe très utile

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

pour spécifier un fichier d'entrée ou utiliser stdin - les deux que je veux dans mon programme. Cependant, le fichier d'entrée n'est pas toujours requis. Si je n'utilise pas -i ou rediriger l'entrée avec l'un des

$ someprog | my_python_prog
$ my_python_prog < inputfile

Je ne veux pas que mon programme Python attende l'entrée. Je veux juste qu'il avance et utilise les valeurs par défaut.

58
Justin Force

La bibliothèque standard documentation pour argparse suggère cette solution pour autoriser les fichiers d'entrée/sortie facultatifs:

>>> 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'>)
102
mikewaters

Utilisez isatty pour détecter si votre programme est en session interactive ou en lecture depuis un fichier:

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

Cependant, pour des raisons de cohérence et de reproductibilité, envisagez de suivre la norme et de lire dans stdin si le nom de fichier est -. Vous voudrez peut-être envisager de laisser le module fileinput gérer cela.

22
phihag