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 :

Demande d'avis : empêcher la deuxième exécution d'un programme


Sujet :

PyQt Python

  1. #21
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Bonjour rambc,

    Citation Envoyé par rambc Voir le message
    Est-ce une idée stupide ?
    Pour que cette solution marche, il faut qu'elle réponde aux 2 questions:

    1- comment une 2e instance s'aperçoit-elle qu'une 1ère instance fonctionne déjà?

    2- comment, après une 1ère instance arrêtée brutalement, cette 1ère instance peut-elle être relancée alors que le fichier témoin est toujours là?

    En sachant que c'est, dans les 2 cas, le même programme, donc le même code, qui s'exécute.

    Creuse un peu ta solution, et essaye de répondre aux 2 questions.


    Même si la solution "sharedMemory" fonctionne, elle a pour inconvénient d'empêcher la 2ème instance dans tous les cas, y compris dans le cas d'une utilisation "multi-utilisateurs" (Unix), ce qui n'est pas forcément souhaitable.

    On pourrait, par exemple, vouloir empêcher qu'un programme puisse être relancé 2 fois quand il travaille sur les mêmes données! Et dans ce cas, la solution du fichier témoin, placé dans le répertoire de ces données, serait intéressante.

    De même s'il s'agissait d'empêcher une 2ème instance pour le même utilisateur, avec un fichier témoin placé dans son "home" (qu'il est facile de trouver avec Python).

    Tyrtamos

  2. #22
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    On pourrait, par exemple, vouloir empêcher qu'un programme puisse être relancé 2 fois quand il travaille sur les mêmes données! Et dans ce cas, la solution du fichier témoin, placé dans le répertoire de ces données, serait intéressante.

    De même s'il s'agissait d'empêcher une 2ème instance pour le même utilisateur, avec un fichier témoin placé dans son "home" (qu'il est facile de trouver avec Python).
    J'en profite, pendant que c'est encore frais dans ma tête, pour répondre à mes propres questions: comment avec la solution sharedMemory empêcher un 2e lancement du programme seulement pour un même utilisateur, ou seulement sur un même répertoire ou fichier de données?

    C'est super-simple: il suffit d'ajouter à l'identifiant unique du programme, le chemin du répertoire du home de l'utilisateur ou celui du répertoire ou du fichier des données, et d'encoder ce chemin avec, par exemple, base64.

    L'avantage de l'encodage base64, est que même si le chemin comporte des espaces ou des caractères accentués (surtout avec Windows), la chaine résultat n'en comportera pas.

    Voilà, par exemple, ce que donnerait le répertoire des données: "C:\Users\tyrtamos\mes données" en base64 (attention: le résultat dépend de l'encodage de la chaine! ici utf-8):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    import base64
    print base64.b64encode(r"C:\Users\tyrtamos\mes données")
    QzpcVXNlcnNcdHlydGFtb3NcbWVzIGRvbm7DqWVz
    Voilà la solution avec le home de l'utilisateur:

    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
     
    #! /usr/bin/python
    # -*- coding: utf-8 -*-
    # Python v2.7
     
    import os, sys
    import base64
     
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
    class Fenetre(QtGui.QMainWindow):
     
        #========================================================================
        def __init__(self, parent=None):
            super(Fenetre,self).__init__(parent)
     
     
    #############################################################################
    if __name__ == "__main__":
     
        # lancement du graphique
        app = QtGui.QApplication(sys.argv)
     
        # on définit l'identificateur unique de ce programme
        progid = u"D6BB05B2919732D8F29045842531CAD23162E1B9"
     
        #auquel on ajoute le chemin du home de l'utilisateur, encodé base64     
        progid += base64.b64encode(os.path.expanduser(u'~'))
     
        # on prépare la création d'une zone partagée avec cette clé unique
        sharedMemory = QtCore.QSharedMemory(progid)
     
        # on essaye de créer cette zone partagée de taille 50 (quelconque):
        # si ce n'est pas possible, c'est qu'elle existe déjà, et donc
        # qu'elle a été créée par une instance précédente du même programme!
        if not sharedMemory.create(50):
            QtGui.QMessageBox.warning(None,
                             u"Vérification",
                             u"""
     
    Attention:
     
    ce programme est déjà en cours d'exécution
     
    utilisez la version déjà lancée!
     
                             """)
            app.quit()
            sys.exit(0)
     
        # lancement de la fenêtre
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Avec ce code, et dans un contexte multi-utilisateurs (Unix), ou même sous Windows avec une ouverture d'une session sans fermeture de la précédente, un même utilisateur ne pourra pas lancer 2 fois ce programme, mais cela n'empêchera pas à un 2ème utilisateur de lancer ce même programme pour lui.

    Pour la solution avec un répertoire ou un fichier de données (le fichier d'une base sqlite par exemple), il suffit de remplacer le os.path.expanduser par leur chemin. Dans ce cas, quelque soit l'utilisateur, on ne pourra pas lancer 2 fois ce programme pour le faire travailler sur les données concernées.

    Tyrtamos

  3. #23
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour tyrtamos,

    Juste un détail avec l'unicode
    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
    patrice@Zeus:~/Bureau$ /usr/bin/python2.6
    Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
    [GCC 4.4.5] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os
    >>> print os.path.expanduser(u'~')
    /home/patrice
    >>> print os.path.expanduser('~')
    /home/patrice
    >>> quit()
    patrice@Zeus:~/Bureau$ /usr/bin/python3.1 
    Python 3.1.2 (release31-maint, Sep 17 2010, 20:34:23) 
    [GCC 4.4.5] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os
    >>> print (os.path.expanduser(u'~'))
      File "<stdin>", line 1
        print (os.path.expanduser(u'~'))
                                     ^
    SyntaxError: invalid syntax
    >>> print (os.path.expanduser('~'))
    /home/patrice
    @+

  4. #24
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Bonjour PauseKawa,

    Je ne fais qu'utiliser expanduser selon la doc.

    Essaye sans le 'u'?

    Tyrtamos

  5. #25
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    C'est fait la ligne en dessous.

  6. #26
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Merci pour l'info!

    Les Python 2.x supportent de mieux en mieux les encodages, mais ce n'est pas encore parfait... J'essaye de travailler le plus possible en unicode, mais quelquefois, ça ne marche pas, et la notice n'aborde pas toujours clairement ce problème.

    Tyrtamos

  7. #27
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Malheureusement mon path ne comporte pas de caractère permettant de tester l'expanduser mais voici ce que cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #! /usr/bin/python
    # -*- coding: utf-8 -*-
    #
    #
    print(r"C:\Users\tyrtamos\mes données")
    print("C:\Users\tyrtamos\mes données")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    patrice@Zeus:~/Bureau$ /usr/bin/python2.6 tyrtamos.py 
    C:\Users\tyrtamos\mes données
    C:\Users	yrtamos\mes données
    patrice@Zeus:~/Bureau$ /usr/bin/python3.1 tyrtamos.py 
      File "tyrtamos.py", line 6
        print("C:\Users\tyrtamos\mes données")
    SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-4: truncated \UXXXXXXXX escape
    patrice@Zeus:~/Bureau$
    Bon code

  8. #28
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Avec une adresse windows comportant des '\', on DOIT mettre le r devant, ou doubler les '\'.

    Tyrtamos

  9. #29
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 751
    Points
    1 751
    Par défaut
    Bonjour.

    On ne peut plus utiliser u"...". Donc il suffit de faire comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MacBook-Pro-de-cbal:~ xxx$ python3
    Python 3.1.1 (r311:74543, Aug 24 2009, 18:44:04) 
    [GCC 4.0.1 (Apple Inc. build 5493)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os
    >>> print(os.path.expanduser('~'))
    /Users/xxx
    Voir ceci pour les chaînes et les bytes sous Python 3.

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/10/2007, 19h53
  2. Demande d'avis sur un bouquin (Deitel)
    Par oodini dans le forum C++
    Réponses: 7
    Dernier message: 26/02/2005, 01h50

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