73 votes

Stdin facultatif en 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 si je ne redirige pas l'entrée avec l'un des

 $ someprog | my_python_prog
$ my_python_prog < inputfile

Je ne veux pas que mon programme Python attende une entrée. Je veux qu'il se déplace et utilise les valeurs par défaut.

126voto

mikewaters Points 1162

La documentation de la bibliothèque standard 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'>)

11voto

palswim Points 4353

En s'appuyant sur la réponse concernant la détection TTY , pour répondre explicitement à la question :

 import sys
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--input-file', type=argparse.FileType('r'), default=(None if sys.stdin.isatty() else sys.stdin))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X