<html><body><div style="font-family: Andale Mono; font-size: 12pt; color: #000000"><div data-marker="__QUOTED_TEXT__"><div style="font-family: Andale Mono; font-size: 12pt; color: #000000;" data-mce-style="font-family: Andale Mono; font-size: 12pt; color: #000000;"><div>Bonjour,<br></div><br><div>Ok merci, je n'avais pas pensé au Start.<br></div><div><br data-mce-bogus="1"></div><div>Pour ceux que cela intéresserait, voici une fonction pour tuer une liste de processus après un certain laps de temps :<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>def waitprocessfinish(exenames, waittime=20):</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    """wait for the process to be completed or timeout > waittime</em></span><br><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    Args:</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>        exenames : list of pending processes</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>        waittime : timeout in seconds. No timeout if waittime=None</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    >>> waitprocessfinish('MATLAB.exe')</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    >>> waitprocessfinish(['MATLAB.exe','cmd.exe'], waittime=None)</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    """</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    def on_terminate(proc):</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>        print("process {} terminated with exit code {}".format(proc, proc.returncode))</em></span><br><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    procs = []</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    logger.debug('Wait process finish %s' % (exenames,))</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    if not isinstance(exenames,list):</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>        exenames = [exenames]</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    exenames = [exe.lower() for exe in exenames]+[exe.lower()+'.exe' for exe in exenames]</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    for p in psutil.process_iter():</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>        try:</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>            if p.name().lower() in exenames:</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>                procs.append(p)</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>        except (psutil.AccessDenied,psutil.NoSuchProcess):</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>            pass</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    logger.debug('Wait process finish %i' % (p.pid,))</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    gone, alive = psutil.wait_procs(procs, timeout=waittime, callback=None)</em></span><br><span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em>    for p in alive: p.kill()</em></span></div><div><br data-mce-bogus="1"></div><div>Je me suis fortement inspiré de la fonction <strong>"killalltasks" </strong>et de ce que j'ai trouvé sur le net.<br data-mce-bogus="1"></div><div>Je n'ai pas compris grand chose à ce que j'ai fait mais cela fonctionne ^^<br data-mce-bogus="1"></div><div>La fonction <span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em> def on_terminate(proc):</em></span> sert au callback de <span style="font-size: 10pt;" data-mce-style="font-size: 10pt;"><em> psutil.wait_procs </em><span style="font-size: 12pt;" data-mce-style="font-size: 12pt;">mais je ne l'ai pas intégré.</span></span><br data-mce-bogus="1"></div></div><div style="font-family: Andale Mono; font-size: 12pt; color: #000000;" data-mce-style="font-family: Andale Mono; font-size: 12pt; color: #000000;"><br><div><div><div style="color: #5e5e5d; font-size: 13px; font-family: arial;" data-mce-style="color: #5e5e5d; font-size: 13px; font-family: arial;"><b><span style="color: #333333;" data-mce-style="color: #333333;">Frédéric G</span><br></b></div><br></div></div><br><hr id="zwchr"><div><b>De: </b>"Denis Cardon" <dcardon@tranquil.it><br><b>À: </b>"Frederic Garesche" <Frederic.Garesche@insa-rennes.fr>, wapt@lists.tranquil.it<br><b>Envoyé: </b>Mardi 5 Juin 2018 18:03:42<br><b>Objet: </b>Re: [Wapt] Comment tuer un processus lors d'une commande run ?<br></div><br><div>Bonjour Frédéric,<br><br>> Je suis dans la création d'un paquet pour Cadence OrCAD 17.2<br>> Les modules "OrCAD Products" s'installent bien.<br>> Par contre il y a un processus(cdnshelpindexer.exe) qui ne fonctionne<br>> pas correctement lors de l'installation des modules  "Allegro Products".<br>><br>> Savez-vous comment tuer un processus alors que la fonction run est<br>> en-cours ?<br><br>pour kiler un process, on peut le faire avec la commande suivante (en <br>prenant pas exemple firefox.exe).<br>  run(r'taskkill /f /im firefox.exe')<br><br>Par contre dans votre cas, il faudrait "threader" le run() pour <br>surveiller le processus en question et le killé le moment voulu. Je ne <br>pense pas que c'est forcément une bonne idée de faire du threading dans <br>le setup.py.<br><br>Vous pouvez essayer de rendre l'installeur "non bloquant" avec un <br>run('START /B moninstalleur.exe') et après mettre une boucle pour <br>vérifier quel process est entrain de tourner et le killer le cas <br>échéant. Il ne faut pas sortir du setup.py tant que l'installation n'est <br>pas fini, sinon l'agent WAPT killera tout dans sa procédure de nettoyage <br>post setup.py.<br><br>Si le process cdnshelpindexer.exe est le dernier qui reste à la fin, <br>vous pouvez rajouter un timeout plus court si l'installeur met à peu <br>prêt toujours le même temps pour s'installer.<br><br>Cordialement,<br><br>Denis<br><br>><br>> Cordialement,<br>><br>> *Frédéric G*<br>><br>><br>> _______________________________________________<br>> WAPT mailing list<br>> WAPT@lists.tranquil.it<br>> http://lists.tranquil.it/listinfo/wapt<br>><br><br>-- <br>Denis Cardon<br>Tranquil IT Systems<br>Les Espaces Jules Verne, bâtiment A<br>12 avenue Jules Verne<br>44230 Saint Sébastien sur Loire<br>tel : +33 (0) 2.40.97.57.55<br>http://www.tranquil.it<br><br>Samba install wiki for Frenchies : https://dev.tranquil.it<br>WAPT, software deployment made easy : https://wapt.fr</div></div><br></div></div></body></html>