捕获python程序的标准输出

本文关键字:标准输出 程序 python 捕获 | 更新日期: 2023-09-27 17:59:41

我正在尝试编写一个C#程序,它可以捕获python程序中的标准输出。我的问题是,所有的输出都是在程序执行之后产生的,而不是在实际发生的时候。例如,对于这个python程序:

print "Hello"
time.sleep(2)
print "Hello"

我希望得到"你好",两秒钟的间隔,然后再得到一个"你好"。实际结果是两秒的差距,然后是"你好","你好"。

如果我从命令行运行上面的python脚本,我会得到所需的行为。如果命令提示符可以做到这一点,那么我应该能够模拟该功能,而不必重复刷新缓冲区。

我用这个从C#运行进程:

_proc = new Process
            {
                StartInfo = new ProcessStartInfo
                                {
                                    FileName = "C:''Python27''python.exe",
                                    Arguments = pyScript,
                                    RedirectStandardError = true,
                                    UseShellExecute = false,
                                    RedirectStandardOutput = true,
                                    CreateNoWindow = true
                                }
            };
_proc.OutputDataReceived += ProcOnOutputDataReceived;
_proc.Start(); 
_proc.BeginOutputReadLine();

我可以运行这个C#代码(并更改上面的ProcessStartInfo属性以运行C#可执行文件),它的行为是正确的:

Console.WriteLine("Hello");
Thread.Sleep(2000);
Console.WriteLine("Hello");

有了这个代码,我得到了"你好",两秒钟的间隔,然后又得到了一个"你好"。

知道为什么吗?如何让python解释器在发生这种情况时发送标准输出?

捕获python程序的标准输出

我知道这是旧的,但运行带有-u选项(无缓冲)的python似乎就是你想要的。

未缓冲区不会在刷新输出之前等待。在没有此选项的情况下运行python,输出在以下情况下刷新:

  • 缓冲区已满
  • 您呼叫sys.stdout.flush()
  • 过程结束

您需要刷新输出缓冲区。

import sys
sys.stdout.flush()

请参阅以下问题:如何刷新Python打印的输出?

好(捕获python程序的标准输出)Em控制台需要:导入系统sys.stdout.flush()