我正在使用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")
答案 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
都包含两个进程的输出。