0

因此,我需要从我的 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')

但是,通过使用基于虚拟 RAM 的文件而不是基于“物理”磁盘的文件来加速管道并减少磁盘使用会很好。我知道我可以使用StringIOtempfile.SpooledTemporaryFile()处理 Python 脚本中的虚拟文件,但是是否有可能将此类文件的链接传递给外部二进制文件?

4

2 回答 2

1

假设您可以告诉您的 2 个程序从 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#replacing-shell-pipeline

另一种选择(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().

于 2014-10-29T12:36:48.630 回答
0
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将被删除。

于 2014-10-29T12:25:05.260 回答