我的最终目标是能够将处理文件的命令行进程用管道连接起来,而不必接触磁盘。这可能吗?我不能使用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一样将数据发送到进程中?请让我知道,如果有任何这是不清楚的!谢谢。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐