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