У меня есть процесс, который записывает непрерывный поток байтов в stdout. У меня есть еще один процесс, который читается с начала первого процесса, а затем заканчивается. Но я обнаружил, что когда второй процесс заканчивается, он закрывает трубу (я думаю), и поэтому процесс 1 останавливается.Подпроцесс python: чтение из трубы без его закрытия
Я попробовал это 2 различными способами:
в оболочке 1:
# make fifo
mkfifo /tmp/camera
# stream video from my webcam to the pipe
ffmpeg -y -f v4l2 -r 10 -i /dev/video0 -f avi /tmp/camera
в оболочке 2:
# attach to pipe and take a snapshot
rrmpeg -y -r 1 -f avi -i /tmp/camera -vframes 1 -s 160x120 -f image2 image1.jpg
Я также попытался это в оболочке 2 с тем же результатом:
tail -f /tmp/camera
Когда p rocess в shell 2 останавливается, он убивает процесс 1. Почему?
Вторая вещь, которую я попытался было с питона подпроцесса:
from subprocess import Popen, PIPE
import shlex, time
stream = Popen(shlex.split("ffmpeg -y -f v4l2 -r 10 -i /dev/video0 -f avi -"), stdout=PIPE)
while True:
time.sleep(3)
snap = Popen(shlex.split("rrmpeg -y -r 1 -f avi -i - -vframes 1 -s 160x120 -f image2 image1.jpg"), stdin=stream.stdout)
Он работает в первый раз через петлю, но когда процесс snap
выходит из области видимости, процесс stream
умирает.
Есть ли способ прочитать часть потока из процесса 1 без его закрытия?
Я пробовал подход 1, и он работал как шарм. Как и было предложено, я написал сценарий python, который открывает трубку и просто спит навсегда. Затем я снова и снова запускал вторую команду без первого зависания процесса. – thayne
Почти пропустил ваш комментарий. - Ожидалось, что это ниже ответа ... ;-) –
Ничего не закрывает 'stream.stdout' в родительском потоке, поэтому' stream' не должен получать SIGPIPE. – jfs