español - subprocess python windows
¿Matar el proceso por su nombre? (14)
Estoy intentando matar un proceso (específicamente iChat). En la línea de comando, uso estos comandos:
ps -A | grep iChat
Entonces:
kill -9 PID
Sin embargo, no estoy exactamente seguro de cómo traducir estos comandos a Python.
9 representa la señal SIGKILL. Entonces puedes usar KILL
en lugar de 9
os.system("kill -s KILL 1234")
0r
os.sytem("kill -KILL 1234")
El siguiente código matará a 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)
Para mí, lo único que funcionó fue:
Por ejemplo
import subprocess
proc = subprocess.Popen(["pkill", "-f", "scriptName.py"], stdout=subprocess.PIPE)
proc.wait()
Puede usar pkill <process_name>
en un sistema Unix para matar el proceso por nombre.
Entonces el código python será:
>>> import os
>>> process_name=iChat
>>> os.system(''pkill ''+process_name)
Puedes probar esto ... antes de tener que instalar psutil usando sudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=[''pid'', ''name'']):
if ''ichat'' in proc.info[''name'']:
proc.kill()
Si desea eliminar el (los) proceso (s) o cmd.exe que llevan un (os) título (s) particular (es).
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ían ser numerosas soluciones mejores para la mía.
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")
Suponiendo que está en una plataforma tipo Unix (por lo que ps -A
existe),
>>> import subprocess, signal
>>> p = subprocess.Popen([''ps'', ''-A''], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
le da salida de ps -A
en la variable de out
(una cadena). Puede dividirlo en líneas y repetirlas ...:
>>> 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 9
lugar de signal.SIGKILL
, pero simplemente no me gusta particularmente ese estilo, así que preferiría 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 buscas es evitar ps
, es difícil hacerlo en diferentes sistemas tipo Unix ( ps
es su API común para obtener una lista de procesos, en cierto sentido). Pero si tiene en mente un sistema específico tipo Unix, solo (sin requerir ninguna portabilidad multiplataforma), puede ser posible; en particular, en Linux, el pseudo sistema de archivos /proc
es muy útil. Pero tendrá que aclarar sus requisitos exactos antes de que podamos ayudar en esta última parte.
esto funcionó para mí en Windows 7
import subprocess
subprocess.call("taskkill /IM geckodriver.exe")
puedes esos comandos exactos de python como este
import os
print os.system(''kill -9 '' + pid)
Pero su orden de obtener el pid necesita un poco de trabajo (no puede suponer simplemente porque tiene iChat que realmente es iChat) debería usar killall en su lugar como lo sugiere Matthew Flaschen
puedes usar el módulo WMI para hacer esto en Windows, aunque es mucho más complicado de lo que las personas de Unix están acostumbradas; import WMI
lleva mucho tiempo y hay un dolor intermedio para llegar al proceso.
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()
import psutil
pid_list=psutil.get_pid_list()
print pid_list
p = psutil.Process(1052)
print p.name
for i in pid_list:
p = psutil.Process(i)
p_name=p.name
print str(i)+" "+str(p.name)
if p_name=="PerfExp.exe":
print "*"*20+" mam ho "+"*"*20
p.kill()