Python execv和管道输出

时间:2017-05-19 17:37:05

标签: python process pipe fork exec

我想使用Python的os.execv来替换我当前的流程,但我也希望新流程将stdout发送到另一个流程(收集日志并通过网络发送)。进程收集日志也需要由原始Python进程启动。

我猜我需要做一些fork,dup2,execv的东西,但我需要一些帮助。

在bash中,它可能看起来像这样

#!/bin/bash
exec ./foo ∣ ./bar

1 个答案:

答案 0 :(得分:3)

您可以设置管道并以此方式处理。

import os

(read_fd, write_fd) = os.pipe()
pid = os.fork()
if pid == 0:
    os.dup2(read_fd, 0)
    os.close(read_fd)
    os.close(write_fd)
    os.execlp('./bar', './bar')
    os._exit(-1)  # in case exec fails
os.close(read_fd)
os.dup2(write_fd, 1)
os.close(write_fd)
os.execlp('./foo', './foo')

使用subprocess仍然很方便,至少在第一部分是这样。

import os
import subprocess

p = subprocess.Popen(['./bar'], stdin=subprocess.PIPE)
os.dup2(p.stdin.fileno(), 1)
p.stdin.close()
os.execlp('./foo', './foo')