Python execv 和管道输出
Python execv and pipe output
我想用Python的os.execv
来代替我现在的进程,但是我也希望新进程发送stdout
到另一个进程(收集日志并通过网络发送它们)。收集日志的进程也需要由原来的Python进程启动。
我想我需要做一些 fork、dup2、execv 的事情,但我需要一些帮助。
在 bash 中,它可能看起来像这样
#!/bin/bash
exec ./foo ∣ ./bar
您可以通过这种方式设置管道和进程。
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')
我想用Python的os.execv
来代替我现在的进程,但是我也希望新进程发送stdout
到另一个进程(收集日志并通过网络发送它们)。收集日志的进程也需要由原来的Python进程启动。
我想我需要做一些 fork、dup2、execv 的事情,但我需要一些帮助。
在 bash 中,它可能看起来像这样
#!/bin/bash
exec ./foo ∣ ./bar
您可以通过这种方式设置管道和进程。
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')