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 :

Problème pour vérifier si processus déjà lancé ==> PSUTIL


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Problème pour vérifier si processus déjà lancé ==> PSUTIL
    Bonjour à tous,

    Je suis nouveau dans le monde de Python, également nouveau sur Développez.net.

    Je suis en train de faire un petit script qui lancerait une tâche uniquement si celle-ci n'existe pas.

    Je suis déjà super étonné qu'il n'existe pas de fonction toute faite dans python..?


    Cela fait maintenant 3 jours que je cherche sans résultat concluant, le code qui se rapproche le plus que j'ai trouvé est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import psutil
    PROCNAME = 'pythonw.exe'
    for proc in psutil.process_iter():
      if proc.name == PROCNAME:
        print("OK")
        else:
          print ("Not found")
    Résultat
    Pourtant si je fais un simple affichage des processus il est bien présent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> for p in psutil.process_iter ():
    	print(p)
     
     
    psutil.Process(pid=0, name='System Idle Process')
    psutil.Process(pid=4, name='System')
    psutil.Process(pid=128)
    psutil.Process(pid=296)
    (...)
    psutil.Process(pid=428)
    psutil.Process(pid=432)
    psutil.Process(pid=36548, name='pythonw.exe')

    Si j'utilise son PID pour l'interroger ça fonctionne, mais pas avec .nom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for p in psutil.process_iter (): 
       if p.pid == 36548: 
         print(p)
         break 
    else: 
       print("Not found")
     
     
    psutil.Process(pid=36548, name='pythonw.exe')

    Vu que le PID change à chaque utilisation de mon processus, je ne peux pas utiliser le PID comme moyen pour le détecter.
    Il me faut donc un moyen de le localiser via son nom.

    Quelqu'un à une solution svp ?

    Un grand merci d'avance,
    Bien à vous

    Gauthier



    Config: Python 3.4 & Win 7 Pro

  2. #2
    Expert éminent

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

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

    Il faut le changer d'abord en dict avant de comparer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    >>> for p in psutil.process_iter():
    ...     try:
    ...             pi = p.as_dict(attrs=['pid', 'name'])
    ...     except:
    ...             pass
    ...     else:
    ...             if pi['name'] == 'pluma':
    ...                     print 'found: ', pi['pid']
    ... 
    found:  27909

  3. #3
    Membre à l'essai
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Résolu
    Ohh chouette ca marche !

    Un grand merci pour ton efficacité et ta rapidité VinsS

    Une bonne soirée à toi,
    A bientôt

    Gauthier

  4. #4
    Membre à l'essai
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Bonsoir,

    Désolé je dois rouvrir le sujet car je n'arrive pas tout à fait à ce que je veux..

    Je trouve bien le processus lancé, mais également l'inverse.

    Vu que mon but est de lancer ce processus si il n'est pas lancé, dans ce cas ci il va me lancer le programme à chaque fois qu'il ne trouvera pas la ligne 'pythonw.exe'.

    Et sur 50 processus il va donc me lancer 49 fois mon programme ..

    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
    for p in psutil.process_iter():
        try:
          pi = p.as_dict(attrs=['pid', 'name'])
        except:
          pass
        else:
          if pi['name'] == 'pythonw.exe':
            print("Présent, pas besoin de démarrer.")
          else:
            print("Pas présent")
     
     
    Pas présent
    Pas présent
    Pas présent
    (...)
    Présent, pas besoin de démarrer.
    Pas présent
    Pas présent
    Comment pourrais-je parer à ce problème ?

    Encore un grand merci d'avance..

    Bonne soirée à tous !


    Gauthier

  5. #5
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Tu dois d'abord vérifier toute la liste, bien sur.

    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
     
    exists = False
    for p in psutil.process_iter():
        try:
            pi = p.as_dict(attrs=['pid', 'name'])
        except:
            pass
     
        else:
            if pi['name'] == 'pythonw.exe':
                exists = True
                # Pas besoin d'aller plus loin
                break
     
    if not exists:
        ... lancer le process

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

    Le nom d'un process n'est pas unique (contrairement au PID). Savoir s'il existe un process nommé "pythonw.exe" ne donne pas d'indication sur le script Python qu'il exécute.
    Il faudrait regarder / analyser le retour de p.cmdline().

    Plus généralement, lancer et gérer une tache permanente est une fonctionnalité du système d'exploitation: la cuisine Windows n'est pas la cuisine Linux/Unix. Pire, vous avez plusieurs méthodes pour ce faire et l'embarras d'avoir à choisir la méthode la plus adaptée à votre cas.

    Sous Windows, ce genre de process s'appellent "services" et peuvent être gérés par "svchost" dont l'API devrait être accessible en Python via le module "winservice" de la bibliothèque win32.
    Mais il y a plein d'autres méthodes pour s'assurer qu'une application n'est lancée qu'une fois basée sur des verrous et/ou des fichiers. Elles ont l'avantage d'être plus simple/portables que passer par le "gestionnaire de services/daemons"

    Hélas, ce n'est pas le langage de programmation qui vous dira quelle méthode sera la plus adaptée à votre cas.

    - W

  7. #7
    Membre à l'essai
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : Août 2014
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup à toi VinsS c'est parfait !


    Wiztricks, merci pour ces précieuses précisions

    Je me doute qu'il y a moyen d'utiliser toutes les API de Windows qui est déjà plus que complet mais je t'avoue que pour mon niveau et utilité de ce script,

    cette méthode suffira amplement ^^.. Le process est unique dans mon cas..


    En tous cas merci beaucoup pour vos réponses et à très bientôt je pense !

    Gauthier

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/12/2012, 16h10
  2. [Débutant] Problème pour afficher label/picture lorsque processus est lancé
    Par RobinEF dans le forum VB.NET
    Réponses: 1
    Dernier message: 27/11/2012, 18h59
  3. Réponses: 1
    Dernier message: 27/08/2012, 14h56
  4. problème pour kill un processus
    Par azräel dans le forum VB.NET
    Réponses: 0
    Dernier message: 10/03/2009, 11h10
  5. problème pour Killer un processus windows
    Par arnofly dans le forum VB.NET
    Réponses: 4
    Dernier message: 19/07/2007, 14h45

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