Ed *_*arl 5 python windows subprocess popen
对于另一个关于Python子进程的问题抱歉,但我找不到这个问题的答案.
我遇到一些Python代码,它在Windows 7 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 )
Run Code Online (Sandbox Code Playgroud)
这给出了输出
out:
err:
Run Code Online (Sandbox Code Playgroud)
但是,当子进程的输出未通过管道传输时,它会按预期生成输出:
# (listing 2)
proc = Popen(cmdline,shell=True)
proc.communicate()
Run Code Online (Sandbox Code Playgroud)
这为控制台提供了预期的输出.
我确信可执行文件实际上是将其输出写入stdout.我有C源代码,我添加了这一行:
fprintf(stdout, "HELLO");
Run Code Online (Sandbox Code Playgroud)
同样,在运行清单2时会看到"HELLO",但不会列出清单1.
我还尝试制作一个新的C++可执行文件并从cmdline调用它:
#include <iostream>
int main()
{
std::cout << "HELLO" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
同样的事情仍然发生 - 运行清单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而不是带有相同结果的communic()方法.Python文档和其他问题表明,communication()方法是正确的使用方法.
这根本不是Python 的问题。我的防火墙设置对可执行文件进行了“沙箱”处理,这导致它们的输出被丢弃,而没有任何类型的警告或错误。
阻止他们执行会更有意义。我想我需要使用不同的防火墙软件。
| 归档时间: |
|
| 查看次数: |
2019 次 |
| 最近记录: |