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 :

Exécuter un fichier Python dans un QObject tout en conservant les signaux en "temps réel"


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de bastou93
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 217
    Par défaut Exécuter un fichier Python dans un QObject tout en conservant les signaux en "temps réel"
    Bonjour à tous,

    Je reviens vers vous car j'ai un petit problème. Je m'explique car j'ai eu du mal à trouver un nom pertinent.

    Je laisse la possibilité dans mon soft aux utilisateurs d'écrire leur propre script en python et de les charger via l'IHM. Pour cela j'ai une classe script qui vient exécuter le fichier (avec exec). Pour garder la gestion de mon IHM, je leur fournis des fonctions tel que l'envoi d'une commande (sendCommand), l'écriture à une adresse (write)...
    Ces fonctions émettent le signal qui va bien pour ensuite dispatcher les actions (affichage dans un widget de message, affichage des données dans un autre Dock... etc).

    Mon problème est que l'appelle de la fonction exec avec le fichier associé s'exécute bien mais cela 'bloc' le soft et à la fin de l'exécution seulement je vois les infos apparaitre un peu partout.

    Ce que je voudrais c'est que cela s'exécute comme si j'avais dans mon code sendCommand("toto"), pause sendCommand("toto") avec tout le reste de mon IHM qui se met à jour au fur et à mesure et non d'un coup à la fin.

    Je me dis que le problème viens peut etre de mon pause, je regarde le truc...

    Voici mon code:

    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
    class Script2(QObject):
        def __init__(self, filename, signalSendCommand):
            super(Script2, self).__init__()
            self.createConnections(signalSendCommand)
     
            self.file = QFile(filename)
            if self.file.open(QIODevice.ReadOnly | QIODevice.Text):
                if '.py' in filename:
                    exec(self.file.readAll())
     
        # ------------------------------------------------------------------
        # Methods     
     
        def createConnections(self, signalSendCommand):
            self.signalSendCommand.connect(signalSendCommand)
     
        def sendCommand(self, command):
            self.signalSendCommand.emit(bytes(command + '\n', 'utf-8')) 
     
        def pause(self, t = 1000):
            time.sleep(t / 1000)
    et mon fichier test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    self.write(0x2000, 0x00, 'b')
    self.pause(1000)
    self.read(0x2000, 'b', 1)
    self.pause(1000)
    self.read(0x2000, 'b', 1)
    self.pause(1000)
    self.read(0x2000, 'b', 1)
    self.pause(1000)
    self.read(0x2000, 'b', 1)
    Merci a tous et bonne journée

    Bastien

  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,

    Quand une tâche lance des affichages dans l'IHM, il est courant que tout s'affiche d'un seul coup à la fin, ce qui n'est pas très beau ni très efficace.

    Si c'est le problème, on peut ajouter après chaque instruction d'affichage l'instruction suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtCore.QCoreApplication.processEvents()
    Ce qui va demander à l'IHM d'exécuter les évènements en attente.

    Si la tâche est tellement longue que l'IHM est gelé, on peut la placer dans un QThread. Celui-ci émettra les instructions d'affichage comme arguments de messages (emit) pour affichage dans l'IHM (le thread ne doit pas toucher directement au graphique: il ne peut que lui envoyer des messages). C'est d'ailleurs cet envoi de messages qui me fait préférer QThread à threading. Mais bien sûr, l'intégration dans un QThread est une complexité supplémentaire, et il faut penser aussi aux possibilités de récupération lors de l'exécution d'un script buggué pour qu'il ne puisse pas planter tout le programme.

    A part cela, c'est rarement raisonnable de permettre à l'utilisateur d'un programme de lancer ses propres scripts Python avec exe: tout est possible pour un utilisateur malicieux ou maladroit, y compris effacer le disque dur, envoyer des données du PC sur le web, ou placer un virus. Peut-être y a-t-il des contremesures à placer en interface (empêcher l'importation de certains modules par exemple)?

  3. #3
    Membre éclairé Avatar de bastou93
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 217
    Par défaut
    Bonjour,

    Merci beaucoup pour t'as réponse, en effet j'ai finalement choisi de passer par un QThread qui reçoit les signaux qui l'intéresse et entre en attente avec des QEventLoop, ce qui fait plutôt bien le job. J'exécute mon script et si jamais j'ai une erreur de syntaxe ou autre je la remonte et arrête l'exécution du script.

    Pour ce qui est des scripts python, en effet à la base je pensais me créer mon propre langage de script mais je me suis dis pourquoi limiter et réinventer un langage quand le python pourrait faire l'affaire. Et ayant des utilisateurs plutôt avancé en informatique 60% on déjà des notions de python.
    Je pensais avant de déployer mon soft restreindre le nombre de méthode utilisable en python et bloquer les 'import' de manière à limiter les problèmes que tu soulignes.

    Si tu as un avis sur la question, n'hésites pas!

    Amicalement,

    Bastien

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

    Citation Envoyé par bastou93 Voir le message
    Si tu as un avis sur la question, n'hésites pas!
    Au minimum, il faut neutraliser "exec", "execfile" , "eval", "__import__" et probablement d'autres dans le code à exécuter. Mais on peut faire tellement de choses avec Python que c'est loin d'être facile...

    Si quelqu'un avait des idées plus complètes sur la question, ça m'arrangerait aussi.

  5. #5
    Membre éclairé Avatar de bastou93
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 217
    Par défaut
    je vais me poser la question semaine prochaine je pense, je te ferai un retour sur les choix que j'aurais pris (qui ne seront certainement pas les meilleurs )

Discussions similaires

  1. Réponses: 10
    Dernier message: 12/05/2010, 11h10
  2. Exécution de fichier "cmd" dans son contexte
    Par tom79 dans le forum Langage
    Réponses: 4
    Dernier message: 27/08/2009, 10h52
  3. est il possible d'exécuter un fichier .sql dans action script ?
    Par wannabi dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 01/09/2008, 15h16
  4. Comment exécuter un fichier contenu dans une ListBox ?
    Par bionicleman dans le forum Composants VCL
    Réponses: 7
    Dernier message: 12/01/2008, 02h53
  5. Exécuter un fichier SQL dans Access
    Par FredFrance21 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 11/01/2008, 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