Jak zamknąć stdout-pipe podczas zabijania procesu rozpoczętego przez podproces Pythona Popen?

Zastanawiam się, czy możliwe jest zamknięcie rury komunikacyjnej, gdy zabijanie podprocesu rozpoczęło się w innym wątku. Jeśli nie wywołam communication (), kill () będzie działać zgodnie z oczekiwaniami, kończąc proces po jednej sekundzie zamiast pięciu.

Znalazłem dyskusję na temat podobnego problemututaj, ale nie mam prawdziwych odpowiedzi. Zakładam, że albo muszę mieć możliwość zamknięcia potoku, albo jawnego zabicia podprocesu (który w tym przykładzie jest „uśpiony”) i zabicia go, aby odblokować potok.

Próbowałem też znaleźć odpowiedź na SO, ale znalazłem tylkoto ito ito, które nie rozwiązują tego problemu bezpośrednio, o ile mogę powiedzieć (?).

Więc chcę zrobić komendę w drugim wątku i uzyskać wszystkie dane wyjściowe, ale mogę go zabić natychmiast, gdy tego pragnę. Mogę przejść przez plik i ogon, który jest podobny lub podobny, ale myślę, że powinien być lepszy sposób, aby to zrobić?

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()

To jest skrypt:

#!/bin/bash
echo "sleeping five"
sleep 5
echo "slept five"

Wydajność

$ time python poc.py 
process: sleeping five

real    0m5.053s
user    0m0.044s
sys 0m0.000s

questionAnswers(3)

yourAnswerToTheQuestion