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.
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'>)
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.