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 -A
exista),
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
le da ps -A
la salida en la out
variable (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 signal
y usar en 9
lugar 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 ( ps
es 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 /proc
pseudo-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
psutil
paquete, 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 dekillall
killall java
?pkill
porque el únicokillall
que 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 psutil
fuente
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 WMI
lleva 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
KILL
en lugar de 90r
fuente
fuente
La respuesta de Alex Martelli no funcionará en Python 3 porque
out
será 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=True
alPopen
constructor.out
luego se devolverá como un objeto de cadena.Alternativamente, puede crear una cadena usando el método decode () de bytes.
fuente
fuente