实时捕获Python程序的标准输出
我正在尝试写一个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
7
我知道这个问题有点老了,但运行 python
时加上 -u
选项(无缓冲)似乎正是你想要的效果。
无缓冲的意思是不会等到缓存满了才输出结果。
如果不加这个选项,输出会在以下几种情况下被清空:
- 当缓存满了
- 你手动调用
sys.stdout.flush()
这个命令 - 程序结束的时候