5

为另一个关于 Python 子进程的问题道歉,但我找不到这个问题的答案。

我遇到了一些在 Windows 7 64 位上调用子进程的 Python 代码的问题。当子进程的标准输出被发送到管道时,不会产生任何输出。子进程似乎可以毫无问题地运行和终止,它只是不产生任何输出。

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

# (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()

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

我确信可执行文件实际上正在将其输出写入标准输出。我有 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”)。

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

4

1 回答 1

2

这根本不是 Python 问题。我的防火墙设置已将可执行文件“沙盒化”,这导致它们的输出被丢弃而没有任何警告或错误。

阻止它们执行会更有意义。我想我需要使用不同的防火墙软件。

于 2012-10-06T13:33:36.213 回答