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 :

manipuler stdout et stderr


Sujet :

Python

  1. #1
    Membre confirmé Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Par défaut manipuler stdout et stderr
    bonjour,

    je voudrais savoir comment manipuler stdout et stderr.

    par exemple,
    disons que je veuille executer un module externe
    qui genere de l'affichage (dans stdout et/ou stderr).
    j'aimerai rediriger, ou bien dupliquer cet affichage ailleurs,
    pendant son execution, puis le restaurer ensuite.

  2. #2
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut
    qu'entends-tu par module externe ? une appli ?

    tu peux faire un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #-*- coding:Utf-8 -*-
    from subprocess import Popen 
     
    fichierSortie = open('monFichierDeSortie.log', 'a+')#on ouvre et on écrit à la fin du fichier
    ps = Popen(['chemin/vers/mon/appli', 'Arguments' ], stdout=fichierSortie, stderr=fichierSortie)
    ps.communicate()#on lance la commande
    fichierSortie.close()

  3. #3
    Membre confirmé Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Par défaut
    oui, ca peut etre une apllication externe,
    mais ca peut aussi etre simplement une fonction.

    dans ton exemple, "fichierSortie" recoie une copie du stdout/stderr de l'appli ?
    (i.e. j'aurai un affichage + copie dans le fichier)

    ou il devient le stdout/stderr de ton appli ?
    (i.e. j'aurai un affichage uniquement dans le fichier)

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut
    il devient l'unique stdout/stderr de l'appli, mais ca ne va pas marcher pour appeler une fonction.

    Utilise alors ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #-*- coding:Utf-8 -*-
    import sys
     
    def test():
            print("un")
     
    if __name__ == '__main__':
            fichierSortie = open('monFichierDeSortie.log', 'a+')
            sortieInitiale = sys.stdout
            sys.stdout = fichierSortie
            test()
            sys.stdout = sortieInitiale
            print("deux")
            fichierSortie.close()

  5. #5
    Membre confirmé Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Par défaut
    super, c'est ca.


    merci bien.

  6. #6
    Membre confirmé Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Par défaut
    question bonus.

    dans le cas d'une fonction, admettons que je ne veuille pas ecrire dans un fichier.

    comment est-ce que je peux creer un genre de "iostream" qui pourra servir d'output pendant l'execution de la fonction ?

    le but, c'est que je puisse ensuite jouer comme bon me semble avec cet "iostream".
    par exemple:
    - traiter son contenu
    - dupliquer partiellement (ou pas) son contenu sur stdout
    - mettre son contenu dans un fichier.
    - ...

    biensur, je pourrais ouvrir un fichier tampon pour le faire, mais je prefererai eviter.

    merci.

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Tu peux émuler un "file object" (et travailler avec ou sans redirection de stdout); voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import sys
     
    class tee:
        def __init__(self, file1, file2=sys.stdout):
            self.file1 = file1
            self.file2 = file2
     
        def write(self, str):
            self.file1.write(str)
            self.file2.write(str)
     
    original_stdout = sys.stdout
    sys.stdout = tee(open("c:\\test.txt","w"))
    print "Hello world!\n"
    sys.stdout = original_stdout
    Définir la méthode write c'est le strict minimum pour pouvoir l'utiliser avec print; mais pour l'utiliser plus sérieurement il faudrait définir quelques autres méthodes de "file" ("close" est la première qui me vient à l'esprit).

  8. #8
    Membre confirmé Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Par défaut
    merci.
    grace a toutes ces informations,
    j'ai pu faire ce que je voulais.

    voici le code final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    import sys
     
    # CrapOstream
    class CrapOstream:
     
      #
      def __init__ (self):
        ""
        self.myTxt = ""
        return None
     
      #
      def write(self, aStr):
        ""
        self.myTxt += aStr
        return None
     
      #
      def getmyTxt(self):
        ""
        return self.myTxt
     
    # main
    if __name__ == "__main__":
     
        initialStdout = sys.stdout # garde l'original pour pouvoir le restaurer
        myStdout = CrapOstream() # ostream (fait maison)
        sys.stdout = myStdout # on l'affecte au systeme
        print "je fais ce que je veux avec mes cheveux." # traitement quelconque produisant de l'affichage
        sys.stdout = initialStdout # on restaure le stdout du systeme
        print "output original:"
        sys.stdout.write(myStdout.getmyTxt()) # pour dupliquer l'affichage normal (comme s'il ne s'etait rien passe)
        txt = myStdout.getmyTxt() # j'ai la l'affichage de mon traitement quelconque
        print "voici mon output censure 8-):"
        print txt[:txt.index('x')+1]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/04/2008, 19h54
  2. stdout.txt stderr.txt ouverture
    Par nightwar dans le forum Eclipse C & C++
    Réponses: 5
    Dernier message: 22/03/2008, 17h48
  3. Filtré sorties stdout et stderr avec open()
    Par Jjeje007 dans le forum Langage
    Réponses: 9
    Dernier message: 09/06/2007, 22h52
  4. Réponses: 2
    Dernier message: 27/10/2006, 17h07
  5. [Runtime][exec]Récupérer les stdout ET stderr
    Par yveslamand dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 20/05/2005, 13h37

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