将分叉python进程的输出重定向到pip

2024-09-30 01:19:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从分叉的Python进程编写一些日志进程到父进程,因此我使用管道对来实现这一点:

rpipe, wpipe = os.pipe()

pid = os.fork()
if pid == -1:
    raise TestError("Failed to fork() in prepare_test_dir")

if pid == 0:
    # Child -- do the copy, print log to pipe and exit
    try:
        os.close(rpipe)
        os.dup2(wpipe, sys.stdout.fileno())
        os.dup2(wpipe, sys.stderr.fileno())
        os.close(wpipe)

        self._prepare_test_dir(test)

        sys.stdout.write(self.copy_log)
    finally:
        os._exit(1)

os.close(wpipe)

_, status = os.waitpid(pid, 0)

# XXX: if copy_log is larger than PIPE_BUF (4-8k), everything
# then is going badly
outf = os.fdopen(rpipe)
self.copy_log = outf.read()

return os.WEXITSTATUS(status)

它不工作,self.copy_log中没有显示任何内容。我还尝试用fdopen显式构造stdout对象:

^{pr2}$

也没用。但是,如果我把print放在dup2之前:

if pid == 0:
    try:
        print 'HELLO'
        os.close(rpipe)
        os.dup2(wpipe, sys.stdout.fileno())
        os.dup2(wpipe, sys.stderr.fileno())
        ...

复制日志成功传递给父级,并将“HELLO”打印到控制终端。我假设print以某种方式影响sys.stdout(使用延迟初始化或其他方式)。有什么想法吗?在

我在各种Linux平台上使用python2.6和2.7。在


Tags: selflogcloseif进程osstdoutsys
1条回答
网友
1楼 · 发布于 2024-09-30 01:19:32

问题似乎不在pipe/dup2相关代码中,而是在os._exit中。杀死python解释器是一种残酷的方法(但是对于分叉的进程来说是可以的,这样它就不会接触到“共享”对象),但是它会导致stdout和{}不会被刷新,数据也会丢失。在

我在child中找到了以下代码:

try:
    os.close(rpipe)
    os.dup2(wpipe, sys.stdout.fileno())
    os.dup2(wpipe, sys.stderr.fileno())
    os.close(wpipe)

    print 'aaaaaaaaa'
except:
    traceback.print_exc(20, sys.stderr)
finally:
    sys.stdout.flush()
    sys.stderr.flush()
    os._exit(1)

相关问题 更多 >

    热门问题