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

2024-09-24 02:17:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我的最终目标是能够将处理文件的命令行进程用管道连接起来,而不必接触磁盘。这可能吗?我不能使用stdin/stdout,因为我需要运行的某些进程只将文件(有时不止一个)作为输入。我已经成功地使用FIFOs和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一样将数据发送到进程中?请让我知道,如果有任何这是不清楚的!谢谢。你知道吗


Tags: 文件管道进程osaswithstdinproc