如何在通常用Python写入文件的外部进程之间交换大型二进制数据(~50MB)

时间:2015-09-11 19:12:47

标签: python unix pipe popen named-pipes

我的最终目标是能够在不触及磁盘的情况下将处理文件的命令行进程组合在一起。这可能吗?我不能使用stdin / stdout,因为我需要运行的一些进程只接受文件(有时不止一个)作为输入。我已经成功地使用FIFO和Popen在Python中使用小文件而不是使用更大的文件(在MB级别上)。以下是我用来测试此功能的一段代码。

fifo1 = os.getcwd()+'/fifo1.nii'
fifo2 = os.getcwd()+'/fifo2.nii'

command = 'diff \''+fifo1+'\' \''+fifo2+'\''

os.mkfifo(fifo1)
os.mkfifo(fifo2)

with open('1_brain.nii', 'rb', 0) as r:
    s1 = r.read()
with open('run1.nii', 'rb', 0) as r:
    s2 = r.read()

def write(fifo, s):
    with open(fifo, 'wb', 0) as f:
        f.write(s)

writer1 = Thread(target=write, args=[fifo1, s1])
writer1.start()

writer2 = Thread(target=write, args=[fifo2, s2])
writer2.start()

proc = Popen(shlex.split(command), stdout=PIPE)

try:
    while proc.poll() == None:
        continue
    print proc.communicate()[0]
except:
    if proc.poll() == None:
        proc.kill()
    os.unlink(fifo1)
    os.unlink(fifo2)
    raise

os.unlink(fifo1)
os.unlink(fifo2)

这适用于小文本文件,但是当我在大型二进制文件上运行时,我的写入线程上出现管道错误,因此在写入完成之前,似乎读取结束(diff进程)正在关闭。我已经通过使用符号链接到stdin文件描述符来获取文件读取进程来读取stdin,但我不能使用stdin,因为我有时需要多个输入。有没有办法让FIFO工作,或者是否有可能创建自己的文件描述符,像stdin一样将数据发送到进程?如果有任何不清楚的地方,请告诉我!感谢。

0 个答案:

没有答案