2011-09-27 4 views
45

je l'ai trouvé très utile la syntaxestdin en option en Python avec argparse

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

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

$ someprog | my_python_prog 
$ my_python_prog < inputfile 

Je ne veux pas que mon programme Python attendre pour l'entrée. Je veux juste avancer et utiliser les valeurs par défaut.

Répondre

74

La bibliothèque standard documentation for argparse suggère cette solution pour permettre aux fichiers d'entrée/sortie en option:

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

Je sais que je l'ai dit à propos de la réponse précédente, mais _this_ est exactement ce que je cherchais. Je vous remercie. –

+4

Je suis absolument désorienté. OP a déclaré que le fichier d'entrée n'était pas toujours requis. Alors, pourquoi 'infile' est-il spécifié en premier? Pourquoi sont-ils positionnels de toute façon? Enfin, pourquoi diable le code OP ne fonctionnerait-il pas? Le tutoriel 'argparse' semble impliquer qu'il devrait fonctionner correctement ... – 2rs2ts

+1

@ 2rs2ts _pourquoi est-ce que' infile' est spécifié en premier? _ - Un ordre particulier des arguments est juste une convention, on s'attend généralement à ce que le premier argument spécifie une entrée et deuxième spécifier la sortie. _Pourquoi sont-ils positionnels de toute façon? _ - En raison de la préférence de l'auteur. Rien de mal avec cette utilisation des arguments positionnels. Peut-être un peu difficile à utiliser dans un scénario lorsque vous voulez lire depuis stdin et écrire dans un fichier, par exemple ''app.py-outfile', mais autre que cet argument positionnel fonctionnerait très bien. _Pourquoi le code d'OP ne fonctionnera-t-il pas? _ - ça fonctionne vraiment bien :) –

17

Utilisez isatty-detect si votre programme est une session interactive ou la lecture d'un fichier:

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

Cependant, dans un souci de cohérence et de reproductibilité, envisager de suivre la norme et la lecture de stdin si le nom du fichier est -. Vous pouvez envisager de laisser le module fileinput gérer cela.

+0

C'est exactement ce que je cherchais. JE VOUS REMERCIE! –