如何使 os.mkfifo 和 subprocess.Popen 一起工作?
我正在尝试使用命名管道重定向 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 命令未完成一样。我怎样才能让它正常工作?
I'm trying to redirect a patch command output using a named pipe. I tried like this:
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()
But my script stops at Popen() call just like patch command didn't completed. How I can make it work properly?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在从 fifo 读取数据之前,您无需等待 patch 命令完成。将
subprocess.Popen()
调用替换为subprocess.call()
,并删除不使用的 stdin/stdout 重定向。另外,请使用open(fifo)
从 fifo 读取数据,而不是os.popen('cat ' + fifo)
。我希望您意识到可以完全避免 FIFO 吗?在
p = Popen(['patch', '--input', fpath], stdout=PIPE)
之后,您可以从 p.stdout 读取 patch 的输出。You aren't waiting for the patch command to finish before you read from the fifo. Replace the
subprocess.Popen()
call withsubprocess.call()
, and remove the stdin/stdout redirections you aren't using. Also, useopen(fifo)
to read from the fifo, notos.popen('cat ' + fifo)
.You realize, I hope, that you can avoid the FIFO entirely? After
p = Popen(['patch', '--input', fpath], stdout=PIPE)
, you can just read patch's output from p.stdout.