Обработка файла ввода / вывода внешнего двоичного файла из 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()
,