通过子进程模块捕获子进程'子进程的输出

时间:2012-02-07 01:50:23

标签: python

我正在使用Popen.communicate来测试学生的课程。我发现了一个令人烦恼的事实,即此API可能无法捕获子进程的子进程的输出。

例如,一位学生写了一些像这样的代码

    if ((pid = fork()) == 0)
    {
        pwd(cwd);
        exit(0);
    }
    else
    {
        int ReturnCode;
        while (pid != wait(&ReturnCode))
        {
            ;
        }
    }

pwd()只打印当前目录

void pwd(const char *cwd)
{
    //printf("Current working directory is:\n");
    printf("%s\n", cwd);
}

我的测试脚本无法使用Popen.communicate获得任何输出。由于不使用多进程的程序可以通过我的测试脚本。我想问题的唯一原因是Popen.communicate一些如何得不到子进程子进程的输出。

有没有为此而走动?

编辑:

这是我的测试脚本

cd_command = '''cd /etc
pwd
cd /var
pwd
'''
def test_cd_pwd(self):
    # self.sh is the process that we are testing.
    self.out, self.err = self.sh.communicate(self.cd_command)
    self.assert_(self.out = "/etc\n/var\n")

1 个答案:

答案 0 :(得分:0)

我无法在这里重现这一点;以下对我有用:

guilty.c:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int pid;
    if ((pid = fork()) == 0)
    {
        printf("Hello from child.\n");
        exit(0);
    }
    else
    {
        int ReturnCode;
        while (pid != wait(&ReturnCode))
        {
            ;
        }
        printf("Goodbye from parent.\n");
    }
}

test.py:

#!/usr/bin/python

from subprocess import Popen, PIPE

proc = Popen(['./a.out'], stdout=PIPE, stderr=PIPE)
out, err = proc.communicate()
print "out:", out
print "err:", err

./test.py的输出:

out: Hello from child.
Goodbye from parent.

err: 

我也尝试过:

  • guilty.c
  • 中没有换行符打印
  • 使用Popen()
  • 运行shell=True

在所有情况下,out都包含两个进程的输出。