Zastanawiam się, czy możliwe jest wyłączenie rury komunikacyjnej podczas zabijania podprocesu rozpoczętego w innym wątku. Jeśli nie wywołasz komendy(), to funkcja kill() będzie działać zgodnie z oczekiwaniami, kończąc proces po jednej sekundzie zamiast pięciu.Jak zamknąć stdout-pipe przy zabijaniu procesu rozpoczętego w podprocesie Pythona?
Znalazłem omówienie podobnego problemu here, ale nie dostałem prawdziwych odpowiedzi. Zakładam, że albo będę musiał zamknąć rurę, albo wyraźnie zabić podproces (który jest "uśpiony" w przykładzie) i zabić, aby odblokować rurę.
Próbowałem również znaleźć odpowiedź na nią, ale znalazłem tylko this i this i this, które nie rozwiązują bezpośrednio tego problemu, o ile mogę powiedzieć (?).
Więc chcę zrobić, aby móc uruchomić polecenie w drugim wątku i uzyskać wszystkie jego wyniki, ale być w stanie zabić go natychmiast, kiedy tak chcę. Mogę przejść przez plik i ogon tego lub podobnego, ale myślę, że powinien być lepszy sposób 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()
Jest to scenariusz:
#!/bin/bash
echo "sleeping five"
sleep 5
echo "slept five"
Wyjście
$ time python poc.py
process: sleeping five
real 0m5.053s
user 0m0.044s
sys 0m0.000s
Kiedy 'process.kill()' nazywa, './ascript.sh' umiera ale' sen 5' wewnątrz niej nie ma. Interesujące jest jednak to, że Python nie wraca natychmiast po śmierci './Ascript.sh'. –