Me pregunto si es posible apagar el conducto de comunicación al matar un subproceso iniciado en un hilo diferente. Si no llamo a communication(), kill() funcionará como se espera, terminando el proceso después de un segundo en lugar de cinco.¿Cómo cierro el stdout-pipe cuando se cancela un proceso iniciado con el subproceso python Popen?
Encontré una discusión de un problema similar here, pero no obtuve ninguna respuesta real. Supongo que o tengo que ser capaz de cerrar la tubería o matar explícitamente el subproceso secundario (que es "dormir" en el ejemplo) y matarlo para desbloquear la tubería.
también traté de encontrar la respuesta en su SO, pero sólo he encontrado this y this y this, que no aborda directamente este problema por lo que yo puedo decir (?).
Así que lo que quiero hacer es poder ejecutar un comando en un segundo hilo y obtener todos sus resultados, pero ser capaz de matarlo instantáneamente cuando lo desee. Podría ir a través de un archivo y la cola que o similar, pero creo que debería haber una mejor manera de hacer esto?
import subprocess, time
from threading import Thread
process = None
def executeCommand(command, runCommand):
Thread(target=runCommand, args=(command,)).start()
def runCommand(command):
global process
args = command.strip().split()
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE)
for line in process.communicate():
if line:
print "process:", line,
if __name__ == '__main__':
executeCommand("./ascript.sh", runCommand)
time.sleep(1)
process.kill()
Este es el guión:
#!/bin/bash
echo "sleeping five"
sleep 5
echo "slept five"
salida
$ time python poc.py
process: sleeping five
real 0m5.053s
user 0m0.044s
sys 0m0.000s
Cuando 'process.kill() se llama' './ascript.sh' muere pero el' 5' sueño dentro de él no lo hace. Es interesante, sin embargo, que Python no regrese inmediatamente después de que muera './Ascript.sh'. –