gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:45:18 28 4
gpt4 key购买 nike

对于另一个关于 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");

同样,“HELLO”在运行 list 2 而不是 list 1 时出现。

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

#include <iostream>

int main()
{
std::cout << "HELLO" << std::endl;
}

同样的事情仍然发生——运行 list 2 时看到“HELLO”,但看不到 list 1。

如果我将 cmdline 设置为“dir”, list 1 和 list 2 都会发生预期的事情 - 目录内容会打印到控制台。

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

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

最佳答案

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

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

关于Windows 7 64 位上的 Python 子进程 - stdout=PIPE 时无输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12759431/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com