捕获 Python 程序的标准输出

joh*_*hnB 1 c# python redirectstandardoutput

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

print "Hello"
time.sleep(2)
print "Hello"
Run Code Online (Sandbox Code Playgroud)

我希望得到“你好”,两​​秒钟的间隔,然后是另一个“你好”。实际结果是两秒钟的间隔,然后是“你好”,“你好”。

如果我从命令行运行上面的 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();
Run Code Online (Sandbox Code Playgroud)

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

Console.WriteLine("Hello");
Thread.Sleep(2000);
Console.WriteLine("Hello");
Run Code Online (Sandbox Code Playgroud)

有了这个代码,我得到了“你好”,两​​秒钟的差距,然后是另一个“你好”。

知道为什么吗?我怎样才能让python解释器在发生时发送标准输出?

小智 5

我知道这很旧,但是使用 -u(无缓冲)运行 python 似乎是你所追求的