Respuestas:
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:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
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:
os.system('taskkill /f /im exampleProcess.exe')
Si tienes killall:
os.system("killall -9 iChat");
O:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
, aunque creo que soy la única persona en el mundo que lo usa en lugar dekillall
killall java
?
pkill
porque el único killall
que conocía era el de "matar todo".
Puedes probar esto. pero antes necesitas instalar psutil usandosudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
El siguiente código eliminará todos los programas orientados a iChat:
p = subprocess.Popen(['pgrep', '-l' , 'iChat'], stdout=subprocess.PIPE)
out, err = p.communicate()
for line in out.splitlines():
line = bytes.decode(line)
pid = int(line.split(None, 1)[0])
os.kill(pid, signal.SIGKILL)
Puede usarlo pkill <process_name>
en un sistema Unix para matar el proceso por su nombre.
Entonces el código de Python será:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
Si desea eliminar los procesos o cmd.exe que llevan un título en particular.
import csv, os
import subprocess
# ## Find the command prompt windows.
# ## Collect the details of the command prompt windows and assign them.
tasks = csv.DictReader(subprocess.check_output('tasklist /fi "imagename eq cmd.exe" /v /fo csv').splitlines(), delimiter=',', quotechar='"')
# ## The cmds with titles to be closed.
titles= ["Ploter", "scanFolder"]
# ## Find the PIDs of the cmds with the above titles.
PIDList = []
for line in tasks:
for title in titles:
if title in line['Window Title']:
print line['Window Title']
PIDList.append(line['PID'])
# ## Kill the CMDs carrying the PIDs in PIDList
for id in PIDList:
os.system('taskkill /pid ' + id )
Espero eso ayude. Podría haber muchas mejores soluciones a la mía.
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.
import os, signal
def check_kill_process(pstring):
for line in os.popen("ps ax | grep " + pstring + " | grep -v grep"):
fields = line.split()
pid = fields[0]
os.kill(int(pid), signal.SIGKILL)
La respuesta de Alex Martelli no funcionará en Python 3 porque out
será un objeto de bytes y, por lo tanto, resultará en una TypeError: a bytes-like object is required, not 'str'
prueba if 'iChat' in line:
.
Citando de la documentación del subproceso :
comunica () devuelve una tupla (stdout_data, stderr_data). Los datos serán cadenas si los flujos se abrieron en modo texto; de lo contrario, bytes.
Para Python 3, esto se resuelve agregando el argumento text=True
(> = Python 3.7) o universal_newlines=True
al Popen
constructor. out
luego se devolverá como un objeto de cadena.
import subprocess, signal
import os
p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE, text=True)
out, err = p.communicate()
for line in out.splitlines():
if 'iChat' in line:
pid = int(line.split(None, 1)[0])
os.kill(pid, signal.SIGKILL)
Alternativamente, puede crear una cadena usando el método decode () de bytes.
import subprocess, signal
import os
p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
out, err = p.communicate()
for line in out.splitlines():
if 'iChat' in line.decode('utf-8'):
pid = int(line.split(None, 1)[0])
os.kill(pid, signal.SIGKILL)