saber - Forma multiplataforma para obtener PID por nombre de proceso en python
ejecutar python desde cmd (8)
No creo que puedas encontrar una solución portátil puramente basada en Python sin usar / proc o utilidades de línea de comandos, al menos no en Python. Analizar os.system no es feo: alguien tiene que lidiar con múltiples plataformas, ya sea usted u otra persona. Implementarlo para el sistema operativo que le interesa debería ser bastante fácil, honestamente.
Varios procesos con el mismo nombre se están ejecutando en el host. ¿Cuál es la forma multiplataforma para obtener PID de esos procesos por nombre usando python o jython ?
- Quiero algo como
pidof
pero en python. (No tengopidof
todos modos.) - No puedo analizar
/proc
porque podría no estar disponible (en HP-UX). - No quiero ejecutar
os.popen(''ps'')
y analizar el resultado porque creo que es feo (la secuencia de campo puede ser diferente en diferentes sistemas operativos). - Las plataformas objetivo son Solaris, HP-UX y tal vez otras.
Primero, Windows (en todas sus encarnaciones) es un sistema operativo no estándar.
Linux (y la mayoría de los unixen propietarios) son sistemas operativos estándar que cumplen con POSIX.
Las bibliotecas C reflejan esta dicotomía. Python refleja las bibliotecas de C.
No hay una forma "multiplataforma" de hacer esto. Tienes que hackear algo con ctypes para una versión particular de Windows (XP o Vista)
No hay, me temo. Los procesos se identifican de manera única por pid, no por nombre. Si realmente debe encontrar un pid por su nombre, entonces tendrá que usar algo como lo que ha sugerido, pero no será portátil y probablemente no funcione en todos los casos.
Si solo tiene que encontrar las pides para una aplicación determinada y tiene control sobre esta aplicación, le sugiero que cambie esta aplicación para almacenarla en archivos en alguna ubicación donde su script pueda encontrarla.
Para jython, si se usa Java 5, puede obtener el id. De proceso de Java de la siguiente manera:
de java.lang.management import *
pid = ManagementFactory.getRuntimeMXBean (). getName ()
No hay una única API multiplataforma, tendrás que verificar el sistema operativo. Para uso basado en posix / proc. Para Windows use el siguiente código para obtener una lista de todos los pids con nombres de proceso correspondientes
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 Class
import psutil
process = filter(lambda p: p.name() == "YourProcess.exe", psutil.process_iter())
for i in process:
print i.name,i.pid
Proporcione todos los pids de "YourProcess.exe"
Puede usar psutil ( https://github.com/giampaolo/psutil ), que funciona 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 imprime:
<psutil.Process(pid=3881, name=''python.exe'') at 140192133873040>
EDITAR 2017-04-27 - aquí hay una función de utilidad más avanzada que verifica el nombre con el nombre de los 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
Una nota sobre el 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()
lugar de proc.name
.