script saber esta ejecutar ejecutando desde como python cross-platform jython hp-ux

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 ?

  1. Quiero algo como pidof pero en python. (No tengo pidof todos modos.)
  2. No puedo analizar /proc porque podría no estar disponible (en HP-UX).
  3. 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).
  4. 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 .