manera multiplataforma para conseguir los PID por el nombre del proceso en Python
-
23-08-2019 - |
Pregunta
Varios procesos con el mismo nombre se están ejecutando en el host. Cuál es la forma de plataforma cruzada para obtener los PID de los procesos por su nombre usando pitón o jython
- Quiero algo así como
pidof
pero en pitón. (No me hepidof
de todos modos.) - No se puede analizar el
/proc
, ya que podría no estar disponible (en HP-UX). - No quiero correr
os.popen('ps')
y analizar la salida, porque creo que es feo (secuencia de campo puede ser diferente en diferentes sistemas operativos). - Plataformas de destino son Solaris, HP-UX, y tal vez otros.
Solución
Puede utilizar psutil ( https://github.com/giampaolo/psutil ), que trabaja en Windows y UNIX:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
if proc.name() == PROCNAME:
print(proc)
En mi máquina que imprime:
<psutil.Process(pid=3881, name='python.exe') at 140192133873040>
EDITAR 27/04/2017 - he aquí una función de utilidad más avanzada que comprueba el nombre en nombre de procesos (), cmdline () y 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
Otros consejos
No hay API multiplataforma único, que tendrá que comprobar para el sistema operativo. Por basada POSIX uso / proc. Para el uso de Windows siguiente código para obtener la lista de todos los PID con coresponding nombres de los procesos
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]
A continuación, puede filtrar fácilmente los procesos que necesita. Para obtener más información sobre las propiedades disponibles de Win32_Process echa un vistazo a Win32_Process Clase
import psutil
process = filter(lambda p: p.name() == "YourProcess.exe", psutil.process_iter())
for i in process:
print i.name,i.pid
Dar a todos los PID de "YourProcess.exe"
En primer lugar, Windows (en todas sus encarnaciones) es un sistema operativo no estándar.
Linux (y más Unices patentada) son los sistemas operativos compatibles con POSIX estándar.
Las bibliotecas de C reflejan esta dicotomía. Python refleja las librerías C.
No hay manera "multiplataforma" para hacer esto. Usted tiene que cortar algo con ctypes para una versión particular de Windows (XP o Vista)
no creo que será capaz de encontrar una solución puramente basado en Python, portátil sin necesidad de utilizar herramientas de línea de comando / proc o, al menos no en pitón en sí. Analizar os.system no es fea - alguien tiene que hacer frente a las múltiples plataformas, sea usted o algún otro. Su aplicación para el sistema operativo le interesa debe ser bastante fácil, la verdad.
No hay, me temo. Los procesos se identifican de forma única por pid no por su nombre. Si realmente tiene que encontrar un PID por su nombre, entonces usted tendrá que usar algo como usted ha sugerido, pero no va a ser portátil y probablemente no funcionará en todos los casos.
Si sólo tiene que encontrar el PID para una determinada aplicación y usted tiene control sobre esta aplicación, entonces me gustaría sugerir cambiar esta aplicación para almacenar archivos en su PID en algún lugar en el que la secuencia de comandos puede encontrarlo.
Para jython, si se utiliza Java 5, entonces se puede obtener el identificador de proceso de Java de la siguiente manera:
java.lang.management de importación *
pid = ManagementFactory.getRuntimeMXBean (). getName ()
Una nota sobre comentario de ThorSummoner
process = [proc for proc in psutil.process_iter() if proc.name == "YourProcess.exe"].
Lo he probado en Debian con Python 3, creo que tiene que ser proc.name()
en lugar de proc.name
.