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 ?
- je veux quelque chose comme
pidof
mais en python. (Je n'ai paspidof
de toute façon.) - je ne peux pas analyser
/proc
parce que c'est peut-être indisponible (sur HP-UX). - 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). - les plates-formes cibles sont Solaris, HP-UX, et peut-être d'autres.
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
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
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"
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.
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)
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.
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 ()
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
.