Хотя вы не должны этого делать (попытка полагаться на жестко заданные задержки по своей природе предрасположена к состоянию гонки), проблема заключается в том, что вы доставляете kill()
, пока sh
все еще запускается.проблема «решается» (не надежно, но достаточно для демонстрации) крошечным sleep
достаточно длинным, чтобы позволить оболочке запуститься и запустить echo
:
import time
from subprocess import Popen, PIPE
check=Popen("echo hello && sleep 1000", shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
time.sleep(0.01) # BAD PRACTICE: Race-condition-prone, use one of the below instead.
check.kill()
print(check.stdout.read())
Тем не менее,гораздо более удачным решением было бы закрыть дескриптор стандартного ввода , чтобы чтения немедленно возвращали 0-байтовые результаты.В более новых версиях Python (современный 3.x) вы можете сделать это с DEVNULL
:
import time
from subprocess import Popen, PIPE, DEVNULL
check=Popen("echo hello && read input && sleep 1000",
shell=True, stdin=DEVNULL, stdout=PIPE, stderr=PIPE)
print(check.stdout.read())
... или, с Python 2.x, аналогичного эффекта можно достичь, передавпустая строка для communicate()
, таким образом close()
немедленно отправляет канал stdin:
import time
from subprocess import Popen, PIPE
check=Popen("echo hello && read input && sleep 1000",
shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
print(check.communicate('')[0])