我正在尝试编写一个 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");
通过这段代码,我得到“Hello”,间隔两秒,然后是另一个“Hello”。
知道为什么吗?我怎样才能让 python 解释器在它发生时发送标准输出?
最佳答案
我知道这是旧的,但是使用 -u
选项(无缓冲)运行 python
似乎是您想要的。
Unbuffered 不会等待刷新输出。 在没有此选项的情况下运行 python,在以下情况下刷新输出:
- 缓冲区已满
- 您调用
sys.stdout.flush()
- 流程结束
关于c# - 捕获 python 程序的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23229377/