对于有关 Python 子进程的另一个问题,我深表歉意,但我找不到这个问题的答案。
我在使用某些在 Windows 7 64 位上调用子进程的 Python 代码时遇到问题。当子进程的标准输出发送到管道时,不会产生任何输出。子进程似乎运行和终止没有问题,只是不产生任何输出。
编辑:相同的代码在 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()
这将向控制台提供预期的输出。
我确信可执行文件实际上正在将其输出写入标准输出。我有 C 源代码,我添加了以下行:
fprintf(stdout, "HELLO");
同样,在运行清单 2 时可以看到“HELLO”,但在运行清单 1 时却看不到。
我还尝试创建一个新的 C++ 可执行文件并从命令行调用它:
#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 而不是 communications() 方法,具有相同的结果。 Python 文档和其他问题表明,communicate() 方法是正确使用的方法。