【问题标题】:Python subprocess on Windows 7 64bit - no output when stdout=PIPEWindows 7 64bit 上的 Python 子进程 - 当 stdout=PIPE 时没有输出
【发布时间】:2012-09-27 09:18:26
【问题描述】:

抱歉,关于 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++ 可执行文件并从 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() 方法是正确的使用方法。

【问题讨论】:

  • 如何运行脚本?什么是命令行?
  • 谢谢。我已经尝试在 proc.stdout 上执行 readline() 而不是使用communicate() ,但这仍然不会产生任何输出。 Python 文档和 stackoverflow 上的其他问题建议使用communicate() 方法,所以我在我的问题中是这样写的。我编辑了问题以添加此信息。运行脚本的命令行就是 C:\Python27\python.exe myscript.py。
  • 所以 check_output、check_call、communication(正如我的回答所示)、winpexpect 等在您的情况下不起作用?
  • check_output、check_call 和您的答案中显示的通信都具有相同的结果,这是有道理的,因为它们都包装了 Popen。我会尝试 winpexpect,但我仍然想知道为什么 Popen 不适合我。

标签: python windows subprocess popen


【解决方案1】:

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

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

【讨论】:

  • 为什么没有stdout=PIPE的可执行文件会产生输出?
  • 也许有一些方法可以利用管道?无论如何,他们应该记录一个大的警告消息,说“program.exe 的输出已禁用”...
  • 这很有趣。 hello.exe &gt; output.txt 是否生成空文件,但仅hello.exe 打印 HELLO? Python 中的前者:with open('output.txt', 'wb') as f: check_call(r'.\hello.exe',stdout=f) 后者可以用 pexpect 模块(它的 Windows 模拟)模拟
  • 我遇到了同样的问题,但我关闭了我电脑上的防火墙。我尝试通过 java、C 或 python 启动应用程序,但它们都无法捕获启动的应用程序的输出。你有什么想法?我被卡住了。
猜你喜欢
  • 2012-05-11
  • 2015-09-01
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多