Обработка файла ввода / вывода внешнего двоичного файла из Python

Из моего скрипта Python мне нужно вызвать два внешних двоичных файла для обработки файла в два этапа:

import os, subprocess
sbp = subprocess.Popen(['program_1', '-i', 'input.file', '-o', 'temp.file'])
sbp = subprocess.Popen(['program_2', '-i', 'temp.file', '-o', 'output.file'])                      
os.remove('temp.file')

Тем не менее, было бы неплохо ускорить конвейер и сократить использование диска, используя файлы на основе виртуальной памяти вместо "физических" дисков. Я знаю, что я могу использовать StringIO или же tempfile.SpooledTemporaryFile() для обработки виртуальных файлов в скрипте Python, но есть ли возможность передать ссылку на такой файл во внешний двоичный файл?

2 ответа

Решение
from subprocess import Popen
from tempfile import NamedTemporaryFile

tmp = NamedTemporaryFile('w+')
sbp = Popen(['program_1', '-i', 'input.file', '-o', tmp.name])
sbp = Popen(['program_2', '-i', tmp.name, '-o', 'output.file'])                      
tmp.close()

В конце tmp будут удалены.

Предполагая, что вы можете указать двум вашим программам чтение и запись в / из stdin и stdout, вы можете просто передать одну команду подпроцесса другой:

import os, subprocess
sp1 = subprocess.Popen(['program_1', '-i', 'input.file'], stdout=subprocess.PIPE)
sp2 = subprocess.Popen(['program_2', '-o', 'output.file'], stdin=sp1.stdout)
sp1.stdout.close()
sp2.communicate()

См. https://docs.python.org/2/library/subprocess.html.

Другой вариант (Unix) - использовать именованный канал (созданный на уровне ОС, например, mkfifo /tmp/mypipe):

import os, subprocess
os.mkfifo('/tmp/mypipe')
sp1 = subprocess.Popen(['program_1', '-i', 'input.file', '-o', '/tmp/mypipe'])
sp2 = subprocess.Popen(['program_2', '-i', '/tmp/mypipe', '-o', 'output.file'])

И это также должно быть возможно использовать os.pipe(),

Другие вопросы по тегам