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 :

Récupérer les logs de Python pour les afficher dans une IHM (PyQt)


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 77
    Par défaut Récupérer les logs de Python pour les afficher dans une IHM (PyQt)
    Bonjour,

    J'aimerais récupérer les logs de Python (tout ce que je vois dans ma console Python) pour ensuite pouvoir l'afficher dans mon IHM.

    J'utilise subprocess.Popen pour exécuter différents traitements. Cela normalement me permet de récupérer les messages d'erreurs etc. avec stdout et stderr.

    Mes traitements ont cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    script = subprocess.Popen(......,shell=False,stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
     
    ui.textErr.setText(script) # afficher les logs dans l'interface
    Ce qui ne marche pas. Qqun peut-il m'aider svp ?

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 305
    Par défaut
    Salut,

    Citation Envoyé par guy16 Voir le message
    Ce qui ne marche pas.
    En suçant mon pouce, je devine que tu obtiens TypeError: QMachin.setText(QString): argument 1 has type 'tuple'

    communicate() retourne un tuple (info ou données du process, None ou error)

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if script[1] is not None:
        ui.textErr.setText(script[1])

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 77
    Par défaut
    J'obtiens cette erreur : TypeError: QTextEdit.setText(str): argument 1 has unexpected type 'bytes'

    Mon code est le même, j'ai rajouté ta partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                script = subprocess.Popen(.........., shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
     
                if script[1] is not None:
                    ui.textEdit.setText(script[1])

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 305
    Par défaut
    Ben, essaye comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        ui.textEdit.setText(str(script[1]))
    Dans le pire des cas fais un print(script) pour voir ce que c'est exactement.

    Edit: modifié pour Python 3

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 77
    Par défaut
    Ah oui, merci!
    Ça marche, mais, ça ne m'affiche pas les messages en temps réel, ça me l'affiche une fois le process terminé. Est-ce possible de l'avoir en temps réel ?
    Et il ne m'affiche plus rien dans la console Python maintenant (ce qui n'est pas grave-grave mais j'aimerais bien l'avoir quand même).
    Et j'ai l'impression qu'il ne m'affiche pas tout ce que j'avais dans la console Python. Est-ce possible d'avoir aussi les print affiché dans l'interface par exemple ?

    Désolé ça fait beaucoup de choses..

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut
    Salut,

    Citation Envoyé par guy16 Voir le message
    Ça marche, mais, ça ne m'affiche pas les messages en temps réel, ça me l'affiche une fois le process terminé. Est-ce possible de l'avoir en temps réel ?
    Si vous programmez avec Qt, il sera préférable d'utiliser QProcess à la place du module subprocess, car vous aurez toute la glue pour communiquer entre le QProcess et le GUI (il vous faudrait la ré-écrire sinon).

    Exemple déterré d'un vieux post:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    import collections
    from PyQt4.QtCore import QProcess, pyqtSignal, pyqtSlot
     
    class Process(QProcess):
        read_line = pyqtSignal(str)
     
        def __init__(self):
            super().__init__()
            self._queue = collections.deque()
            self.readyReadStandardOutput.connect(self._has_data)
            self.finished[int].connect(self._start_next)
     
        @pyqtSlot()    
        def _has_data(self):
            data = self.readAllStandardOutput()
            for line in  bytes(data).decode('utf-8').splitlines():
                if line:
                    self.read_line.emit(line)
     
        def start(self, command):
            queue = self._queue
            if not queue:
                self.read_line.emit('start: %s' % command)
                super().start(command)
            queue.append(command)
     
        @pyqtSlot(int)
        def _start_next(self, exit_code):
            queue = self._queue
            queue.pop()
            self.read_line.emit('*done*')
            if queue:
                self.read_line.emit('start: %s' % queue[0])
                super().start(queue[0])
     
    if __name__ == '__main__':
        import sys
        from PyQt4.QtGui import QApplication, QTextEdit
     
        app = QApplication(sys.argv)
        display = QTextEdit()
        display.show()
     
        process = Process()
        process.read_line.connect(display.append)
     
        process.start('python3 test.py"')
     
        app.exec_()
    Si on y colle le "test.py":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #! /usr/bin/env python3
    #! -*- coding:utf-8 -*-
    import time
    import sys
     
    for x in range(20):
        print ('count:', x)
        sys.stdout.flush()
        time.sleep(0.1)
    Remarquez le "sys.stdout.flush()" et mettez le en commentaires "pour voir".
    Ca raconte que les opérations d'écriture sur un pipe sont "buffered": çà n'écrit pas les lignes au fur et à mesure des "print" mais çà attend d'avoir un certain nombre de bytes dans un buffer interne avant de...
    => changer cela est plutôt "tricky".

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/09/2009, 10h02
  2. Réponses: 0
    Dernier message: 21/09/2009, 23h41
  3. Réponses: 62
    Dernier message: 16/04/2009, 10h09
  4. [Toutes versions] Extraire une valeur d'une ListBox pour l'afficher dans une cellule
    Par stid59 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/04/2009, 22h05
  5. récupérer le nom du serveur et l'afficher dans une jsp
    Par barouz dans le forum Servlets/JSP
    Réponses: 21
    Dernier message: 19/04/2007, 15h32

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