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 :

Partager des données (variables) entre deux processus (scripts) python autonomes


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Biologiste Agronome
    Inscrit en
    Février 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Biologiste Agronome
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2014
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Partager des données (variables) entre deux processus (scripts) python autonomes
    Bonjour,
    Je me sert de python pour un script de capture d'images (timelapse) pour le suivi de la croissance des plantes, que nous appellerons script A.
    Le script A tourne sous Linux (raspbian) sur un Raspberry Pi. Il est lancé au démarrage du Raspberry et est commandé (ON/OFF et capture manuelle) par deux bottons reliés au GPIO du Raspberry.
    J'aimerais voir l'état du script A- c'est à dire voir si la capture est sur ON et depuis combien de temps elle tourne - directement sur smartphone grace à VNC viewer.
    Pour cela j'aimerais créer un Script B dont le but est de créer une petite interface graphique qui affiche l'état du script A et des boutons de pilotage.
    Le script B sera lancé au travers de VNC viewer sur un nouveau bureau créé par le server VNC du raspberry.

    Le script B doit donc obtenir et modifier certaines variables provenant du script A :
    -une variable qui indique le fonctionnement du timelapse : 1 ou 0 (pour On et Off)
    -une variable qui indique la date et l'heure de départ (sous forme de caractère donc ?!)
    -une variable qui indique la date et l'heure de la dernière capture d'image (sous forme de caractère)

    Pour cela je pensais à un fichier écrit par le script A et lu par le script B (et vice versa)
    Mais cette solution ne m'enchante pas... je préférerais que certaines variables soient partagées entre les deux scripts (mais créées par le script A, qui doit pouvoir tourner sans la présence de B).

    J'ai vagabondé un bon moment sur le net, mais toutes les solutions que j'ai trouvé me paraissent très compliquées au vus de mes besoins...
    Voici donc ma question : est-il possible de partager des variables entre deux processus python autonomes, par exemple avec des variables 'global' ?
    Sinon qu'elle est la meilleure solution : Subprocess, sockets, etc....

    Merci d'avance pour vos réponses
    ++

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Je ne connais pas ce mode VNC mais, par contre, le principe de deux scripts interagissant l'un sur l'autre est extrêmement simple à réaliser.

    Si ton script A est déjà implémenté avec des classes ce sera peu de travail, sinon il sera peut-être plus simple de le réécrire plutôt que de jongler avec des [/i]global[/i].

    Si ton script A n'est pas trop gros , peux-tu le montrer ?

  3. #3
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Un exemple de base.

    Script A: engine.py
    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
     
    # -*- coding: utf-8 -*-
     
    from driver import Driver
     
    class Engine(object):
        def __init__(self):
            self.foo = 0
            self.baz = 0
            self.driver = False
     
        def run_driver(self, run):
            if not run:
                # Close the driver
                self.driver.is_alive = False
                self.driver = False
     
            elif not self.driver:
                self.driver = Driver(self)
                self.driver.run()
     
     
    if __name__ == '__main__':
        engine = Engine()
        inp = raw_input('Run the driver ? O/n ')
        if inp not in ('n', 'N'):
            engine.run_driver(True)
    Script B: driver.py
    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
     
    # -*- coding: utf-8 -*-
     
    class Driver(object):
        def __init__(self, engine):
            self.engine = engine
            self.is_alive = False
     
        def run(self):
            self.is_alive = True
            print " * Driver *\nEtats:\n\tfoo: %s\n\tbaz: %s" %(self.engine.foo, 
                                                                self.engine.baz)
            while self.is_alive:
                inp = raw_input('> Editer - Consulter - Fermer e/c/f ? ')
                if inp in ('c', 'C'):
                    print "Etats:\n\tfoo: %s\n\tbaz: %s" %(self.engine.foo, 
                                                           self.engine.baz)
     
                elif inp in ('e', 'E'):
                    self.edit_parametres()
     
                elif inp in ('f', 'F'):
                    self.engine.run_driver(False)
     
        def edit_parametres(self):
            inp = raw_input('Parametre foo (%s): ' % self.engine.foo)
            if inp:
                self.engine.foo = inp
     
            inp = raw_input('Parametre baz (%s): ' % self.engine.baz)
            if inp:
                self.engine.baz = inp
    La difficulté, dans ton cas résidera dans ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    from driver import Driver
    qui impliquera que python voie le volume où se trouve driver.py comme module. (éventuellement avec sys.path.append())

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Jahsensi Voir le message
    Voici donc ma question : est-il possible de partager des variables entre deux processus python autonomes, par exemple avec des variables 'global' ?
    Une variable globale ou pas n'existe que "dans" un interpréteur = un process système.
    Partager = communiquer l’état de... entre différents process système.

    Pour cela je pensais à un fichier écrit par le script A et lu par le script B (et vice versa)
    C'est "basique" mais simple a comprendre et a réaliser
    Surtout si vous éviter "et vice versa" i.e. utiliser le même tuyau pour aller dans les deux sens.
    Vous pouvez même vous appuyez sur les dates de création/mise a jour des fichiers pour savoir s'il faut "relire" ou pas.

    Pour simplifier, A mets a jour un dict:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data['timelapse'] = 1
    data['start_dt'] = datetime(...)
    data['last_capture'] = datetime(...)
    Lorsque le fichier doit etre mis a jour, on transforme/serialise le dict en json via un json.dumps(data).
    C'est a ce moment que sont transformes les représentations boolean, datetime, float,... interne en "strings"
    Et vous faites faire par la biblio. qui va bien.

    Cote B, on ouvre le fichier on deserialize le json et on a les "data".

    Sinon qu'elle est la meilleure solution : Subprocess, sockets, etc....
    Les solutions plus élaborées ont les mêmes caractéristiques : sérialisation/deserialisation d'objets.
    Un tuyau pour pousser les données: sockets sera plus rapide/flexible que "fichiers".
    Mais le prix du ticket d’entrée n'est pas le même.

    De toutes façons, produire et utiliser les données (échangées) est le plus important.
    Le tuyau pourra toujours être amélioré plus tard (si nécessaire).

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

  5. #5
    Candidat au Club
    Homme Profil pro
    Biologiste Agronome
    Inscrit en
    Février 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Biologiste Agronome
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2014
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour vos réponses (ultra rapides !!)

    @VinsS: Je dégrossis mon script pour qu'il soit lisible et je le met en ligne ! Merci pour ton code, le truc c'est que je suis un gros débutant et il me faut du temps pour le comprendre bien qu'il ne soit pas très long... (je n'ai jamais utiliser de class ). Cependant a ce que j'ai compris le script A crée une variable "partagée" qui "appartient" au script B. Donc lorsque le script B démarrera il récupérera directement la valeur de la variable "partagée" ('inp' si j'ai compris...), puis cette dernière continuera d'être mis à jour par A.... C'est compliqué (pour moi) et honnêtement je me sens un poil perdu...bien que j'ai envie de comprendre, donc je vais me renseigner sur les "class".
    Bref une fois mon script en ligne tu me diras si c'est jouable !

    @wiztricks: Là pour le coup c'est plus simple et je pense avoir compris ! Par contre quand j'écrivais "travailler sur un fichier", j'entendais écrire un csv ou txt.... Mais ta version me plait beaucoup !!

    Une variable globale ou pas n'existe que "dans" un interpréteur = un process système.
    Partager = communiquer l’état de... entre différents process système.
    Comme ça c'est clair !!

    Deux questions :

    Surtout si vous éviter "et vice versa" i.e. utiliser le même tuyau pour aller dans les deux sens.
    Donc si je crée un "tuyau" dans l'autre sens avec un "data2" dans le script A (toujours?)ce dernier peut être lu par A et écrit par B ?
    Dans ce cas c'est nickel et à ma portée !

    Et vous faites faire par la biblio. qui va bien.
    tu parles de Json ? ou sinon c'est quoi la biblio qui va bien ?

    Un tuyau pour pousser les données: sockets sera plus rapide/flexible que "fichiers".
    Mais le prix du ticket d’entrée n'est pas le même.
    surtout avec mes connaissances...
    En tout cas merci, ta solution me parait adaptée à mes souhaits et à mes compétences !!


    J'essaye vos solutions et posterais si ca marche !
    ++
    V

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/11/2011, 09h43
  2. Partager un bloc mémoire entre deux processus ?
    Par bvsud dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 20/02/2010, 01h20
  3. [vector] Partager une même variable entre deux objets.
    Par Ekinoks dans le forum SL & STL
    Réponses: 18
    Dernier message: 25/08/2005, 20h40
  4. Partage d'une variable entre les processus fils
    Par Mehdi Feki dans le forum Linux
    Réponses: 7
    Dernier message: 09/01/2005, 13h34

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