Почему два подпроцесса мешают друг другу работать? - PullRequest
0 голосов
/ 01 марта 2019

У меня проблема с получением двух подпроцессов для совместной работы.

Первыми подпроцессами является транскодирование видеопотока:

subprocess.Popen("ffmpeg -i input output", shell=True)

Мне нужно, чтобы это выполнялось в фоновом режиме моей программы, транскодируя видео с моей IP-камеры в поток mjpeg.

Вторым подпроцессом является демон Openalpr, который просматривает поток mjpeg и возвращает номерные знаки автомобилей, которые он видит в потоке.

 subprocess.Popen("alprd -f", shell=True)

Вот пример кода теста Python, который пытаетсязапустите оба подпроцесса:

import subprocess
subprocess.Popen("ffmpeg -i input output", shell=True)
subprocess.Popen("alprd -f", shell=True)

Когда я это сделаю, транскодирование ffmpeg работает нормально, я могу просмотреть транскодированный поток mjpeg и увидеть подробный вывод ffmpegs в консоли.Однако демон alprd, похоже, не возвращает номерные знаки, как ожидалось.Фактически, я не вижу никакого вывода из alprd в окне консоли.

Если я запускаю приведенный выше код только с одним подпроцессом, он работает, например,

import subprocess
subprocess.Popen("ffmpeg -i input output", shell=True)

работает нормально, как и:

import subprocess
subprocess.Popen("alprd -f", shell=True)

Если я запускаю любой из двух приведенных выше фрагментов рабочего кода и одновременно запускаю другую команду в отдельном терминале Linux, все это работает.

Яявно не понимая что-то с подпроцессами, они явно конфликтуют друг с другом, но может ли кто-нибудь объяснить, что происходит и как решить проблему?

Спасибо!

1 Ответ

0 голосов
/ 01 марта 2019

Вероятно, что ffmpeg и alprd оба пытаются взаимодействовать с одинаковыми дескрипторами файла stdin / stdout.Чтобы решить эту проблему, создайте отдельные каналы для одного или обоих подпроцессов, чтобы использовать их как stdin / stdout.Тогда они могут взаимодействовать с ними, не мешая друг другу.

import subprocess

with open('ffmpeg-output.txt', 'w') as ffmpeg_output:
    ffmpeg = subprocess.Popen(
        ['ffmpeg', '-i', 'input', 'output'],
        stdin=subprocess.PIPE,
        stdout=ffmpeg_output,
        stderr=subprocess.STDOUT)
    # We won't be sending any input into ffmpeg's stdin, so close it.
    ffmpeg.stdin.close()

    # alprd inherits stdin, stdout, and stderr from the current process.
    alprd = subprocess.Popen(['alprd', '-f'])

    # Wait for the subprocesses to finish.
    ffmpeg.wait()
    alprd.wait()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...