Estoy tratando de matar un proceso (específicamente iChat). En la línea de comando, uso estos comandos:
ps -A | grep iChat
Luego:
kill -9 PID
Sin embargo, no estoy exactamente seguro de cómo traducir estos comandos a Python.
Suponiendo que está en una plataforma similar a Unix (para que ps -Aexista),
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
le da ps -Ala salida en la outvariable (una cadena). Puede dividirlo en líneas y recorrerlas ...:
>>> for line in out.splitlines():
... if 'iChat' in line:
... pid = int(line.split(None, 1)[0])
... os.kill(pid, signal.SIGKILL)
...
(podría evitar importar signaly usar en 9lugar de signal.SIGKILL, pero no me gusta particularmente ese estilo, así que prefiero usar la constante nombrada de esta manera).
Por supuesto, podría hacer un procesamiento mucho más sofisticado en estas líneas, pero esto imita lo que está haciendo en shell.
Si lo que busca es evitar ps, eso es difícil de hacer en diferentes sistemas similares a Unix ( pses su API común para obtener una lista de procesos, en cierto sentido). Pero si tiene un sistema específico similar a Unix en mente, solo (que no requiere portabilidad multiplataforma), puede ser posible; en particular, en Linux, el /procpseudo-sistema de archivos es muy útil. Pero deberá aclarar sus requisitos exactos antes de que podamos ayudar en esta última parte.
psutil puede encontrar el proceso por nombre y matarlo:
fuente
psutilpaquete, que puede no estar presente en la máquina de destino.Si tiene que considerar el caso de Windows para ser multiplataforma, intente lo siguiente:
fuente
Si tienes killall:
O:
fuente
pkill, aunque creo que soy la única persona en el mundo que lo usa en lugar dekillallkillall java?pkillporque el únicokillallque conocía era el de "matar todo".esto funcionó para mí en Windows 7
fuente
Puedes probar esto. pero antes necesitas instalar psutil usando
sudo pip install psutilfuente
El siguiente código eliminará todos los programas orientados a iChat:
fuente
Puede usarlo
pkill <process_name>en un sistema Unix para matar el proceso por su nombre.Entonces el código de Python será:
fuente
Si desea eliminar los procesos o cmd.exe que llevan un título en particular.
Espero eso ayude. Podría haber muchas mejores soluciones a la mía.
fuente
puede usar el módulo WMI para hacer esto en Windows, aunque es mucho más torpe de lo que la gente de Unix está acostumbrada;
import WMIlleva mucho tiempo y hay un dolor intermedio para llegar al proceso.fuente
Para mí lo único que funcionó fue:
Por ejemplo
fuente
9 representa la señal SIGKILL. Entonces puedes usar
KILLen lugar de 90r
fuente
fuente
La respuesta de Alex Martelli no funcionará en Python 3 porque
outserá un objeto de bytes y, por lo tanto, resultará en unaTypeError: a bytes-like object is required, not 'str'pruebaif 'iChat' in line:.Citando de la documentación del subproceso :
Para Python 3, esto se resuelve agregando el argumento
text=True(> = Python 3.7) ouniversal_newlines=TruealPopenconstructor.outluego se devolverá como un objeto de cadena.Alternativamente, puede crear una cadena usando el método decode () de bytes.
fuente
fuente