实时捕获Python程序的标准输出

2 投票
3 回答
3146 浏览
提问于 2025-04-18 03:48

我正在尝试写一个C#程序,用来捕捉一个Python程序的标准输出。我的问题是,所有的输出都是在程序执行完后才出现,而不是在实际发生的时候。举个例子,对于这个Python程序:

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

我本来期待能看到“Hello”,然后等两秒,再看到另一个“Hello”。但实际结果却是先等了两秒,然后才看到“Hello”,“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");

用这段代码我能看到“Hello”,然后等两秒,再看到另一个“Hello”。

有人知道这是为什么吗?我该怎么让Python解释器在输出发生时就发送标准输出呢?

3 个回答

0

好的, (实时捕获Python程序的标准输出) 在控制台中需要: import sys sys.stdout.flush()

2

你需要清空输出缓冲区。

import sys
sys.stdout.flush()

可以看看这个问题:如何清空Python打印的输出?

7

我知道这个问题有点老了,但运行 python 时加上 -u 选项(无缓冲)似乎正是你想要的效果。

无缓冲的意思是不会等到缓存满了才输出结果。

如果不加这个选项,输出会在以下几种情况下被清空:

  • 当缓存满了
  • 你手动调用 sys.stdout.flush() 这个命令
  • 程序结束的时候

撰写回答