У меня есть такая конструкция:
os.mkfifo('pipe.tmp')
enc = Popen(['encoder', '-i', 'pipe.tmp'])
cap = Popen(['capture', '-f', 'pipe.tmp'])
здесь cap
- это процесс, который обычно записывает в файл (указанный в -f
), но я могу заставить его выводить данные на экран, указав / dev / stdout
] как выходной файл. аналогично, enc
ожидает чтения из файлового объекта, и я могу заставить его читать из канала, указав -
в качестве входных данных. поэтому вместо использования именованного канала в операционной системе, я подумал, что специальный файл может не понадобиться, я могу использовать безымянный канал вроде этого ..
cap = Popen(['capture', '-f', '/dev/stdout'], stdout=PIPE)
enc = Popen(['encoder', '-i', '-'], stdin=cap.stdout)
cap.stdout.close()
(обратите внимание также на изменение порядка порождения на противоположное). Мне это нравится больше, потому что временный файл кажется ненужным, но меня немного беспокоит, будет ли эта конструкция связывать процессы так, как я ожидаю.
/ dev / stdout
, с которым общается cap
, отличным от фактического stdout в ОС? то есть с входным конвейером -
в enc
получу ли я чистый канал данных между этими двумя процессами, даже если другие процессы общаются с / dev / stdout в ОС? cap
/ enc
не будет писать / читать достаточно быстро, но поправьте меня если я ошибаюсь.