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

PyQt Python Discussion :

QProcess avec un script Python


Sujet :

PyQt Python

  1. #1
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut QProcess avec un script Python
    Bonsoir,

    je rencontre un souci... je dois passer à coté de quelque chose...

    J'ai créé un fichier python3 qui fait un travail (autonome) et renvoie via des print des infos.

    Dans un autre logiciel, j'utilise des qprocess, je lance la commande via un qpocess :
    python3 fichier.py

    et la mon process ne renvoie aucune info...

    WorkReply : ne me renvoie rien avec mon fichier python autonome.
    WorkFinished : me dit bien quand c'est terminé

    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
        def WorkReply(self):
            """Fonction recevant tous les retours du travail en cours."""
            data = self.process.readAllStandardOutput()
            for line in bytes(data).decode('utf-8').splitlines():
                print(line)
     
        def WorkFinished(self):
            print("la commande est terminée")
     
     
    self.process = QProcess() # Création du QProcess
    self.process.setProcessChannelMode(1) # Unification des 2 sorties (normale + erreur) du QProcess
    self.process.readyReadStandardOutput.connect(self.WorkReply) # Retours du travail
    self.process.finished.connect(self.WorkFinished) # Fin du travail
     
    self.process.start("python3 fichier.py")

    j'ai essayé en remplaçant print par sys.stdout.write mais pas de changement...

    suis je passé à coté de quelque chose ?

    Merci à vous.

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour hizoka,

    Voilà un petit programme de test. Le code python "fichier.py" lancé par QProcess ne contient qu'une seule ligne: print("Coucou")

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    import sys
    from PyQt5 import (QtWidgets, QtCore)
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
            self.resize(300,200)
     
            self.bouton = QtWidgets.QPushButton("Lancer le processus", self)
            self.bouton.clicked.connect(self.clicbouton)
     
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.bouton, 0, 0)
            self.setLayout(posit)
     
            self.process = None
     
        @QtCore.pyqtSlot()
        def clicbouton(self):
            """exécuté lors du clic sur le bouton
            """
            self.process = QtCore.QProcess()
            self.process.setProcessChannelMode(QtCore.QProcess.MergedChannels)
            self.process.readyReadStandardOutput.connect(self.WorkReply)
            self.process.finished.connect(self.WorkFinished)
            commande = "python fichier.py"
            self.process.start(commande, QtCore.QIODevice.ReadWrite)
            self.process.waitForStarted()
     
        @QtCore.pyqtSlot()
        def WorkReply(self):
            """Exécuté lorsque le processus envoie des infos à afficher.
               La chaine renvoyée par data() est de type byte, terminée
               par une fin de ligne. 
               L'encodage dépend de la commande lancée.
            """
            data = self.process.readAllStandardOutput().data()
            ch = str(data, encoding="utf-8").rstrip()
            print(ch)
     
        @QtCore.pyqtSlot()
        def WorkFinished(self):
            """exécuté à la fin du processus
            """
            if self.process!=None:
                # le processus vient de se terminer: on fait le ménage
                self.process.readyReadStandardOutput.disconnect()
                self.process.finished.disconnect()
                print("Processus terminé")
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        fen.show()
        sys.exit(app.exec_())
    A l'exécution, il s'affiche bien ce qui est attendu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Coucou
    Processus terminé

  3. #3
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Salut et merci pour ta réponse.

    Donc oui en effet ça fonctionne, et après test il s'avere que ca fonctionne aussi mon soft...

    en fait le probleme, c'est qu'il renvoie tous les print en une fois à la fin...

    dans ton exemple si le fichier fichier.py contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    print("coucou")
    time.sleep(5)
    print("coucou2")
    tout sera renvoyé en une fois à la fin.

    Il faudrait envoyer les valeur au fur et à mesure car mon script python dure longtemps car il traite pas mal de données.

    Une idée ?

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par hizoka Voir le message
    Il faudrait envoyer les valeur au fur et à mesure car mon script python dure longtemps car il traite pas mal de données.
    Bizarre, parce que ça, ça marche chez moi. Cela peut-il dépendre de l'OS (chez moi: Windows 10)?

    Tu peux regarder le fil que j'avais ouvert moi-même sur ce sujet: http://www.developpez.net/forums/d15...s/#post8496218.

    Grâce à ça, j'ai réussi ce que je cherchais: un traitement de vidéos avec ffmpeg dans un QProcess et affichage en temps réel dans un QTextEdit dans des traitements qui durent plusieurs minutes: ça marche très bien!.

    Essaie de mettre la ligne suivante à la fin de la méthode WorkReply:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtCore.QCoreApplication.processEvents()
    C'est censé forcer le traitement des évènements en attente.

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtCore.QCoreApplication.processEvents()
    Pas de changement, il me renvoie tout à la fin... arf...

    je suis sous linux (kubuntu).

    Je vais me pencher sur ton autre message.

    Mais c'est dommage car ça fonctionne très bien avec tous les autres logiciels dont j'ai besoin (mkvmerge, mkclean...)

    je vous tiens au jus.

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

    Essayez avec: self.process.start("python3 -u fichier.py")

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

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour wiztricks

    Citation Envoyé par wiztricks Voir le message
    Essayez avec: self.process.start("python3 -u fichier.py")
    Bravo: ça marche avec LinuxMint (enfant d'Ubuntu) en console, alors que j'avais le même pb que hizoka.

    Curieusement, sans le '-u':

    - sous Windows 10, on a bien l'affichage ligne par ligne.

    - sous LinuxMint avec Eclipse, , on a aussi l'affichage ligne par ligne.

    - sous LinuxMint en console: toutes les lignes arrivent en même temps, juste avant l'arrêt du processus.

    J'avais essayé d'introduire une option de non-bufferisation au démarrage du processus avec "QtCore.QIODevice.Unbuffered", mais ça n'a rien changé.

    A hizoka de dire si ça marche aussi chez lui avec cette solution.

    Merci!

  8. #8
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    wiztricks => je n'étais absolument pas partie sur l'idée que ça pouvait venir de là !
    A première vue ça fonctionne (du moins le fichier test avec le sleep) !

    il faut que je teste plus avec mon logiciel mais c'est plutôt bien parti

    EDIT : ça fonctionne bien
    Merci beaucoup !

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

Discussions similaires

  1. [Python 3.X] problème de débutant avec premier scripts - python 3.4.2 - IDLE, Notepad ++
    Par James Ogram dans le forum Général Python
    Réponses: 7
    Dernier message: 23/01/2015, 00h09
  2. Se loguer automatiquement avec un script python
    Par bastien981 dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 14/05/2012, 15h45
  3. comparaison de deux fichiers textes avec un script python
    Par zekruss dans le forum Général Python
    Réponses: 1
    Dernier message: 10/11/2009, 05h52
  4. edition d'un fichier .txt avec un script python
    Par ziedzekri dans le forum Général Python
    Réponses: 7
    Dernier message: 06/10/2009, 00h14
  5. Executer un CppUnittest avec un script python
    Par merlinerick dans le forum Bibliothèques tierces
    Réponses: 6
    Dernier message: 20/08/2009, 14h13

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