IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

argparse - lire du texte depuis stdin


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut argparse - lire du texte depuis stdin
    Bonjour,

    Je viens de passer sous Python3 et cela fait 2h que je bloque sur un détail. Je souhaite donc transmettre un fichier à mon script par un pipe (sous Linux) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat monfichier.txt | python3 monscript.py
    Voici ce que contient mon script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import sys, argparse
     
    parser = argparse.ArgumentParser()
     
    parser.add_argument('fichier', nargs="?", type=argparse.FileType('r'),
    						default=sys.stdin, help="translation table file")
     
    args = parser.parse_args()
     
    for line in args.fichier:
    	print(line)
    Le script tourne dans le vide et ne retourne rien. Notez que si je le lance de cette manière, en argument :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    python3 monscript.py monfichier.txt
    Là, tout fonctionne. Qu'est-ce que j'ai manqué ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par kifferand Voir le message
    Là, tout fonctionne. Qu'est-ce que j'ai manqué ?
    Les "arguments" que le programme récupère depuis la ligne de commande ne sont pas lus depuis "stdin" mais ce doit être vrai avec n'importe quel programme Linux et pas seulement un programme écrit avec Python.

    Après il y a l'instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    parser.add_argument('fichier', nargs="?", type=argparse.FileType('r'),
    						default=sys.stdin, help="translation table file")
    "defaut" dit seulement la valeur à assigner si l'argument n'est pas présent.
    Vous espérez qu'en écrivant cela il va se débrouiller pour lire tout ce qu'il récupère de stdin? Que nenni!

    Si c'est ce que vous voulez, pas besoin d'argparse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data = ""
    for line in sys.stdin:
        data += line
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci !

    Citation Envoyé par wiztricks Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    parser.add_argument('fichier', nargs="?", type=argparse.FileType('r'),
    						default=sys.stdin, help="translation table file")
    Vous espérez qu'en écrivant cela il va se débrouiller pour lire tout ce qu'il récupère de stdin? Que nenni!
    Étrange, c'est exactement ce que ça faisait sous python 2.x... Et c'est précisément ce que j'aimerais retrouver : l'entrée devrait pouvoir être indifféremment pipée ou précisée en argument.

    Quant à ce que vous suggérez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for line in sys.stdin:
       print(line)
    ça a le même effet (ne renvoie rien et tourne infiniment)...

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par kifferand Voir le message
    Étrange, c'est exactement ce que ça faisait sous python 2.x... Et c'est précisément ce que j'aimerais retrouver : l'entrée devrait pouvoir être indifféremment pipée ou précisée en argument.
    Sous Python2, le script que vous avez posté se contente de planter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "xbar_7.py", line 10, in <module>
        for line in args.table:
    AttributeError: 'Namespace' object has no attribute 'table'
    Et l'erreur est la même sous Python3.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Toutes mes excuses, le problème vient d'ailleurs... Je viens de tenter sur une autre machine, et tout fonctionne.

    1. Ceci marche bien avec le texte pipé ou en argument :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import sys, argparse
     
    parser = argparse.ArgumentParser()
     
    parser.add_argument('fichier', nargs="?", type=argparse.FileType('r'),
    						default=sys.stdin, help="translation table file")
     
    args = parser.parse_args()
     
    for line in args.fichier:
    	print(line)
    2. Le problème ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "xbar_7.py", line 10, in <module>
        for line in args.table:
    AttributeError: 'Namespace' object has no attribute 'table'
    J'ai mal recopié. Il faut changer la variable "args.table" en "args.fichier". Sinon, évidemment, aucun "table" n'a été déclaré en argument d'argparse.

    Bref, c'est un problème que je soupçonne dû à ma dernière installation de python3.4... Je vais voir ça de mon côté.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/02/2008, 11h37
  2. [FLASH 8] Problème pour lire un texte
    Par Halobox dans le forum Flash
    Réponses: 2
    Dernier message: 11/01/2006, 21h59
  3. Lire un texte dans une ressource en dll
    Par fred78 dans le forum Langage
    Réponses: 2
    Dernier message: 03/11/2005, 18h08
  4. [JAR]ouverture de fichier texte depuis executables jar
    Par julien31 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 01/03/2005, 15h53
  5. [MSDE 2000] Récup champ text depuis proc stockée
    Par Air'V dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/12/2003, 19h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo