Windows 7 64位上的Python子进程-当stdout=PIPE时没有输出


对于另一个关于Python子流程的问题,我深表歉意,但我找不到答案。

我遇到了一些Python代码的问题,这些代码在Windows7 64位上调用子进程。当子流程的stdout被发送到管道时,不会产生任何输出。子流程运行和终止似乎没有问题,只是没有产生任何输出。

编辑:同样的代码在WinXP 32位上也能正常工作,所以我更新了问题标题。

# (listing 1)
from subprocess import *
#cmdline= (a valid command line)
proc = Popen(cmdline,shell=True,stdout=PIPE,stderr=PIPE)
out, err = proc.communicate()
print( out )
print( err )

这会产生输出

out:
err:

但是,当子流程的输出未通过管道传输时,它会按预期产生输出:

# (listing 2)
proc = Popen(cmdline,shell=True)
proc.communicate()

这为控制台提供了预期的输出。

我确信可执行文件实际上是在将其输出写入stdout。我有C源代码,我添加了一行:

fprintf(stdout, "HELLO");

同样,在运行清单2时可以看到"HELLO",但在运行清单1时看不到。

我还尝试制作一个新的C++可执行文件,并从cmdline:调用它

#include <iostream>
int main()
{
std::cout << "HELLO" << std::endl;
}

同样的情况仍然存在——运行清单2时会看到"HELLO",但运行清单1时不会看到。

如果我将cmdline设置为"dir",那么清单1和清单2都会发生预期的事情——目录内容将打印到控制台。

我尝试过的其他东西:Python 3.3和Python 2.7(结果相同);bufsize=0(结果相同);正在检查proc.returncode(正如预期的那样,它是0);删除stderr=PIPE(在这种情况下,清单1给出了预期的"err:None")。

EDIT-我还尝试了out=proc.stdout,而不是communicate()方法,得到了相同的结果。Python文档和其他问题表明communicate()方法是正确的使用方法。

这根本不是Python的问题。我的防火墙设置对可执行文件进行了"沙盒"处理,这导致它们的输出被丢弃,而没有任何警告或错误。

如果阻止他们执行死刑,那会更有意义。我想我需要使用不同的防火墙软件。

最新更新