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

  1. Quiero algo así como pidof pero en pitón. (No me he pidof de todos modos.)
  2. No se puede analizar el /proc, ya que podría no estar disponible (en HP-UX).
  3. 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).
  4. Plataformas de destino son Solaris, HP-UX, y tal vez otros.
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top