如何让os.mkfifo和subprocess.Popen协同工作?

1 投票
1 回答
3460 浏览
提问于 2025-04-15 18:14

我正在尝试使用命名管道来重定向一个patch命令的输出。我是这样做的:

fifo = os.path.join(self.path, 'pipe')
os.mkfifo(fifo)
op = os.popen('cat '+ fifo)
proc = Popen(['patch', current_keyframe, '--input='+fpath, '--output='+fifo], stdin=PIPE, stdout=PIPE)
os.unlink(fifo)
print op.read()

但是我的脚本在调用Popen()时就停住了,就好像patch命令没有完成一样。我该怎么做才能让它正常工作呢?

1 个回答

2

你在读取fifo(一个特殊的文件,用于进程间通信)之前,没有等补丁命令执行完。你可以把 subprocess.Popen() 这个调用换成 subprocess.call(),同时去掉那些你并不需要的输入输出重定向。另外,读取fifo的时候,应该用 open(fifo),而不是 os.popen('cat ' + fifo)

我希望你明白,其实你完全可以不使用FIFO?在执行 p = Popen(['patch', '--input', fpath], stdout=PIPE) 之后,你可以直接从 p.stdout 读取补丁的输出。

撰写回答