Moyen multiplate-forme d'obtenir des PID par nom de processus en python

plusieurs processus avec le même nom sont en cours d'exécution sur host. Quelle est la façon d'obtenir des PID de ces processus par leur nom en utilisant python ou jython ?

  1. je veux quelque chose comme pidof mais en python. (Je n'ai pas pidof de toute façon.)
  2. je ne peux pas analyser /proc parce que c'est peut-être indisponible (sur HP-UX).
  3. je ne veux pas courir os.popen('ps') et analyser la sortie parce que je pense qu'elle est laide (la séquence de champ peut être différente dans différents OS).
  4. les plates-formes cibles sont Solaris, HP-UX, et peut-être d'autres.
47
demandé sur Julien 2009-02-15 13:23:56

8 réponses

vous pouvez utiliser psutil ( https://github.com/giampaolo/psutil ), qui fonctionne sur Windows et UNIX:

import psutil

PROCNAME = "python.exe"

for proc in psutil.process_iter():
    if proc.name() == PROCNAME:
        print(proc)

sur ma machine il imprime:

<psutil.Process(pid=3881, name='python.exe') at 140192133873040>

EDIT 2017-04-27 - voici une fonction utilitaire plus avancée qui vérifie le nom par rapport au nom des processus(), cmdline () et exe ():

import os
import psutil

def find_procs_by_name(name):
    "Return a list of processes matching 'name'."
    assert name, name
    ls = []
    for p in psutil.process_iter():
        name_, exe, cmdline = "", "", []
        try:
            name_ = p.name()
            cmdline = p.cmdline()
            exe = p.exe()
        except (psutil.AccessDenied, psutil.ZombieProcess):
            pass
        except psutil.NoSuchProcess:
            continue
        if name == name_ or cmdline[0] == name or os.path.basename(exe) == name:
            ls.append(name)
    return ls
65
répondu Giampaolo Rodolà 2017-04-27 02:35:34

il n'y a pas d'API multiplateformes, vous devrez vérifier L'OS. Pour une utilisation basée sur posix / proc. Pour Windows, utilisez le code suivant pour obtenir la liste de tous les PID avec les noms de processus correspondants

from win32com.client import GetObject
WMI = GetObject('winmgmts:')
processes = WMI.InstancesOf('Win32_Process')
process_list = [(p.Properties_("ProcessID").Value, p.Properties_("Name").Value) for p in processes]

, Vous pouvez facilement filtrer les processus dont vous avez besoin. Pour plus d'informations sur les propriétés disponibles de Win32_Process consultez Win32_Process Class

11
répondu Ivan 2009-08-04 10:00:18
import psutil

process = filter(lambda p: p.name() == "YourProcess.exe", psutil.process_iter())
for i in process:
  print i.name,i.pid

donnez tous les pids de " votre processus.exe 151920920"

8
répondu baco 2017-04-21 22:05:11

Je ne pense pas que vous serez en mesure de trouver une solution purement basée sur python, portable sans utiliser /proc ou les utilitaires en ligne de commande, du moins pas en python lui-même. L'analyse de l'os.le système n'est pas laid - quelqu'un doit composer avec de multiples plates-formes, que ce soit vous ou quelqu'un d'autre. L'implémenter pour L'OS qui vous intéresse devrait être assez facile, honnêtement.

3
répondu David Cournapeau 2009-02-15 10:35:56

tout d'abord, Windows (dans toutes ses incarnations) est un OS non standard.

Linux (et la plupart des unixen propriétaires) sont des systèmes D'exploitation standards conformes à POSIX.

Les bibliothèques C refléter cette dichotomie. Python reflète les bibliothèques C.

il n'y a pas de moyen" Cross-platform " pour le faire. Vous devez pirater quelque chose avec ctypes pour une version particulière de Windows (XP ou Vista)

3
répondu S.Lott 2009-02-15 12:43:05

il n'y en a pas, je le crains. Les processus sont identifiés de façon unique par le pid et non par leur nom. Si vous devez vraiment trouver un pid par nom, alors vous devrez utiliser quelque chose comme vous l'avez suggéré, mais il ne sera pas portable et ne fonctionnera probablement pas dans tous les cas.

si vous n'avez qu'à trouver les PID pour une certaine application et que vous avez le contrôle de cette application, alors je suggère de changer cette application pour stocker son pid dans des fichiers à un endroit où votre script peut le trouver.

1
répondu ubiyubix 2009-02-17 14:21:30

pour jython, si Java 5 est utilisé, vous pouvez obtenir L'identifiant du processus Java comme suit:

de java.lang.gestion des importations *

pid = ManagementFactory.getRuntimeMXBean ().getName ()

1
répondu ccyu 2009-04-07 18:30:37

Une note sur ThorSummoner le commentaire de

process = [proc for proc in psutil.process_iter() if proc.name == "YourProcess.exe"].

j'ai essayé Debian avec Python 3, je pense que ça doit être proc.name() au lieu de proc.name .

0
répondu pchaitat 2017-05-23 12:02:48